复习一下二进制的内容。

计算机中所有的信息最终都是以二进制 0 和 1 来表示。阅读计算机历史,了解这样的缘由主要是计算机系统硬件实现、符合逻辑运算。主要表现在二进制的数据表达具有抗干扰能力强、可靠性高的优点。所以,想了解这部分的内容,可以看看计算机历史相关书籍。

二进制和十进制的转换

10 被称为十进制计数法的基数,也是十进制中“十”的由来。这里先拿十进制举例,比如数字 2561,可以拆成:

以此类推,二进制就是使用 2 作为基数,比如二进制数字 11010,转换为十进制数字就是:

在 Python 语言中的十进制和二进制互换,也比较简单。

1
2
3
4
5
6
# 二进制转十进制
print(int("11010",2,))
print('-'*20)

# 十进制转二进制。0b的意思表示二进制
print(bin(26))
1
2
3
26
--------------------
0b11010

二进制的位运算

二进制位运算,包括向左移位、向右移位、“或”、“与”、“异或”。

向左移位表示二进制 11010 向左移一位,就是在末尾添加一位 0,因此 11010 就变成了 110100。向右移位表示二进制 11010 向右移一位,就是去掉末尾一位,因为二进制最前面的 0 可以省略。 因此 11010 就变成了 1101。

逻辑“或”的意思是,参与操作的位中只要有一个位是 1,那么最终结果就是 1,也就是“真”。如果将二进制 110101 和 100011 的每一位对齐,进行按位的“或”操作,就会得到 110111。

image.png
图:数据科学家-黄申

“与”的意思是,参与操作的位中必须全都是 1,那么最终结果才是 1(真),否则就为 0(假)。如果将二进制 110101 和 100011 的每一位对齐,进行按位的“与”操作,就会得到 100001。

image.png
图:数据科学家-黄申

逻辑“异或”和“或”有所不同,它具有排异性,也就是说如果参与操作的位相同,那么最终结果就为 0(假),否则为 1(真)。所以,如果要得到 1,参与操作的两个位必须不同,这就是此处“异”的含义。将二进制 110101 和 100011 的每一位对齐,进行按位的“异或”操作,可以得到结果是 10110。

image.png
图:数据科学家-黄申

在 Python 语言中的运算,分别是|(或运算)、&(与运算)、^(异或运算),左右移位是箭头表示,下面演示:

1
2
3
4
5
6
7
8
# 向左移位
print( bin(4))
print('-'*20)
print (bin(8) )
print('-'*20)

# 将4的二进制向左移位一次即末尾添加一个0
print (4<<1)
1
2
3
4
5
0b100
--------------------
0b1000
--------------------
8
1
2
3
4
5
6
7
# 向右移位
print (bin(4))
print('-'*20)
print (bin(2))
print('-'*20)
# 将4的二进制向右移位一次即末尾删除一位
print (4>>1)
1
2
3
4
5
0b100
--------------------
0b10
--------------------
2
1
2
3
4
5
print(bin(0b110 | 0b101),"或运算")
print('-'*20)
print(bin(0b110 & 0b101),"与运算")
print('-'*20)
print(bin(0b110 ^ 0b101),"异或运算")
1
2
3
4
5
0b111 或运算
--------------------
0b100 与运算
--------------------
0b11 异或运算