在之前我们已经看过了简单的数字和操作。在本文中,将学习数字在计算机内部是如何工作的。
更详细:虽然这不是在 web 应用程序或大多数桌面应用程序直接有用的,但是知道这些是非常有用的。如果你不只关心这一点,可以跳到下一个教程学习。在本文中,将学习在 Python 中如何使用二进制数,如何将它们转换为小数,怎么做位操作运算等。
二进制数字
在最低水平,计算机对任何数字无概念,除了'有一个信号“或”这些不是一个信号“。也可以认为这是一个电灯开关:要么在开关打开,要么关闭。这个微小的信息,一台电脑存储的最小量,被称为一个比特。表示一个比特位或低(0)或高(1)。
为了表示大于 1 的更高数字,这个想法诞生了使用比特序列。八位的序列可以存储更大的数字,这被称为一个字节。序列由1和0组成被称为:二进制。传统计数系统十位数字被称为十进制。
让我们来看看,在实践的例子中:
# Prints out a few binary numbers. print int('00', 2) print int('01', 2) print int('10', 2) print int('11', 2)
第二个参数2,告诉Python中我们有一批基于2个元素(1和0)。要转换一个字节(8位)为十进制,简单的写了八位在第一个参数的组合。
# Prints out a few binary numbers. print int('00000010', 2) # outputs 2 print int('00000011', 2) # outputs 3 print int('00010001', 2) # outputs 17 print int('11111111', 2) # outputs 255
计算机如何做到这一点?每隔数位(从右到左)乘以2的幂。
数字 ‘00010001‘ 就是 (1 x 2^0) + (0 x 2^1) + (0 x 2^2) + (0 x 2^3) + (1 x 2^4) + (0 x 2^5) + (0 x 2^6) + (0 x 2^7) = 16 + 1 = 17. 请记住,由右至左读。
数字 ‘00110010’ 也就是 (0 x 2^0) + (1 x 2^1) + (0 x 2^2) + (0 x 2^3) + (1 x 2^4) + (1 x 2^5) + (0 x 2^6) + (0 x 2^7) = 32+16+2 = 50.
自己尝试序列'00101010',看看你是否了解和在Python程序中验证。
使用二进制数的逻辑运算
二进制左移和二进制右移
乘法由两个因素的因子2和除法在二进制中很容易。我们只是转移向左或向右位。我们左移如下:
Bit 4 | Bit 3 | Bit2 | Bit 1 |
---|---|---|---|
0 | 1 | 0 | 1 |
1 | 0 | 1 | 0 |
在移(0,1,0,1)之前,数字为:5。移动(1,0,1,0)之后,数字为:10。在 Python 中,可以使用按位向左符(<<)转向左,右位运算符(>>)右移。
inputA = int('0101',2) print "Before shifting " + str(inputA) + " " + bin(inputA) print "After shifting in binary: " + bin(inputA << 1) print "After shifting in decimal: " + str(inputA << 1)
结果输出:
Before shifting 5 0b101 After shifting in binary: 0b1010 After shifting in decimal: 10
AND运算符
鉴于两个输入,电脑就可以做一些逻辑与位运算。让我们使用 AND运营符。如果输入A和B是正的,输出将是正的。我们将展示AND运算以图形方式,两个左边作为输入A和B,正确的圆是输出:在这个代码很简单,只要使用&符号,它代表了逻辑与运营符。
# This code will execute a bitwise logical AND. Both inputA and inputB are bits. inputA = 1 inputB = 1 print inputA & inputB # Bitwise AND
通过改变输入后有相同的结果,使用上面的图像。我们可以与操作符在序列上:
inputA = int('00100011',2) # define binary sequence inputA inputB = int('00101101',2) # define binary sequence inputB print bin(inputA & inputB) # logical AND on inputA and inputB and output in binary
结果如下:
0b100001 # equals 00100001
这是有道理的,因为如果做了以上运算:
00100011 00101101 -------- Logical bitwise AND 00100001
OR 运算符
现在,我们已经学会了AND运算符,让我们一起来看看 OR运算符。给定两个输入,输出将为零只有当A和B均为0。要执行它,我们使用|运算。位序列可以简单地这样执行:
inputA = int('00100011',2) # define binary number inputB = int('00101101',2) # define binary number print bin(inputA) # prints inputA in binary print bin(inputB) # prints inputB in binary print bin(inputA | inputB) # Execute bitwise logical OR and print result in binary
结果如下:
0b100011 0b101101 0b101111
XOR 运算符
这是一个有趣的运算符:异或或短XOR。为了执行它,我们使用^运算。位序列可以简单地这样执行:
inputA = int('00100011',2) # define binary number inputB = int('00101101',2) # define binary number print bin(inputA) # prints inputA in binary print bin(inputB) # prints inputB in binary print bin(inputA ^ inputB) # Execute bitwise logical OR and print result in binary
结果如下:
0b100011 0b101101 0b1110