按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:
按位与 &
& 举例: 5&3 = 1 解释: 101 11 相同位仅为个位1 ,故结果为 1
按位或 |
| 举例: 5|3 = 7 解释: 101 11 出现1的位是 1 1 1,故结果为 111
按位异或 ^ /xor ,相同取0,相异取1.
^ 举例: 5^3 = 6 解释: 101 11 对位相加(不进位)是 1 1 0,故结果为 110
b^0=b,a^a=0
a^b=c—>a^c=b—>b^c=a—>a^b^c=0
按位取反 ~
~ 举例: ~5 = -6 解释: 将二进制数+1之后乘以-1,即~x = -(x+1),-(101 + 1) = -110
按位反转仅能用在数字前面。所以写成 3+~5 可以得到结果-3,写成3~5就出错了
补码:二进制数在内存中以补码的形式存储。
最高位为符号位,正数的符号位为 0,负数为 1。
正数的源码与补码、反码一致,为本身二进制表示。
负数的补码为:把该数绝对值的补码取反得到反码,然后对整个数加 1,即得该数的补码。
bin(n & 0xffffffff)可用来获得正数/负数的32位二进制补码。
此时获得的并不是这个负数的补码,只是形式与负数的32位二进制补码相同。
或bin(n+2**32).count('1') #统计负数补码中1的个数
-
~7,对 7 进行取反:7 的补码是 00000111 对补码取反得到 11111000,最高位 1 为符号位,表示负数,所以该补码对应的整数为 -8。
-
~-7 对 -7 进行取反:-7 的补码是 11111001 对补码取反得到 00000110,最高位 0 为符号位,表示正数,所以补码对应的整数为 6。
按位左移 <<
<< 举例: 5<<2 = 20 解释:101 向左移动2位得到 10100 ,即右面多出2位用0补
按位右移 >>
>> 举例: 5>>2 = 1 解释:101 向右移动2位得到 1,即去掉右面的2位
if name == ‘main’:
a = 0x77 #将a转换成数字,a等于119,二进制表示为0111 0111
b = a & 3 #将3表示成二进制为 0011,根据按位与规则,二者结果为0011,转换成十进制为3,所以结果为3
print (‘a & b = %d’ % b)
b &= 7 #即b=b&7 将7表示成二进制为0111,根据按位与规则,结果为0011,转换成十进制也是3
print (‘a & b = %d’ % b)
以上程序的输出结果为:
a & b = 3
a & b = 3
原文链接:https://blog.csdn.net/wangfei8348/article/details/51744311