Python之位运算
在计算机中所有的数都是以二进制的形式存在的,位运算就是直接对整数在计算机中对应的二进制位进行操作。
位运算分为 6 种如下:
按位与 | & |
按位或 | | |
按位异或 | ^ |
按位取反 | ~ |
左移运算 | << |
右移运算 | << |
重点:二进制数在内存中以补码的形式存储!!,因此位运算都是要基于补码进行操作的
原码、反码、补码:https://www.cnblogs.com/Zzbj/p/13621019.html
一、按位与
运算中的两个数,二进制的对应位都为1,则该位的结果为1,否则为0。
a = 40 b = 10 c = a & b """ 按位与 40 = 010 1000补 10 = 000 1010补 8 = 000 1000补=原 """ print(c) # 8
二、按位或
运算中的两个数,二进制的对应位中只要有一个为1时,结果位就为1,否则为0。
a = 40 b = 10 c = a | b """ 按位或 40 = 010 1000补 10 = 000 1010补 42 = 010 1010补=原 """ print(c) # 42
三、按位异或
运算中的两个数,二进制的对应位中当两个对应位相异时,结果为1,否则为0。
a = 40 b = 10 c = a ^ b """ 按位异或 40 = 010 1000补 10 = 000 1010补 34 = 010 0010补=原 """ print(c) # 34
四、按位取反
把二进制数的每个二进制位取反,即把1变为0, 把0变为1。
a = 40 c = ~a """ 按位取反 注意: 1.由于二进制数在内存中以补码的形式存储,所以我们需要把得到的二进制数转成补码 正数原反补一样,第一个0是符号位。 40补 = 010 1000 2.按位进行取反,把40的补码进行按位取反,得到的也是一个补码 取反[补] = 101 0111 3.取反后的二进制补码转为原码计算数值 但是由于按位取反后变为负数,所以我们需要用负数的补码转换规则:符号位不变,按位取反,末位加一 取反[原] = 110 1001 = -41 """ print(c) # -41
五、左移运算
将一个数的各二进制位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
运算结果式子:
x 为整数 x << n = x * (2ⁿ) # x 乘以 2的n次方
a = 40 c = a << 2 """ 左移运算 40 = 0010 1000补 (00)1010 0000补=原 高位丢弃,低位补0 """ print(c) # 160
六、右移运算
将一个数的各二进制位全部右移若干位,由">>"右边的数指定移动的位数,低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1。
运算结果式子:
x 为整数 x >> n = x / (2ⁿ) # x 除以 2的n次方
a = 40 # 40补 = 010 1000 b = -40 # -40补 = 101 1000 c = a >> 2 d = b >> 2 e = a & b """ 右移运算:低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1 40 = 010 1000 补 000 1010(00)补=原=10 -40 = 101 1000 补 111 0110(00) 补 100 1010 原 = -10 按位与 40 = 010 1000 补 -40 = 101 1000 补 000 1000 补=原 """ print(c) # 10 print(d) # -10 print(e) # 8