“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com
按位操作符直接操作二进制的字符串,这些是最基本的操作,并直接由中央处理器所支持。
在处理设备驱动程序、图形底层、加密和网络通信时,这些位操作是必需的。本文提供一些有用的知识和对应Python的按位运算符示例
Bitwise NOT 位操作:否
〜运算符将翻转数字中的所有位, 由于计算机使用带符号的数字表示形式占大多数,所以值得注意的是,二进制补码符号用于在写入负数的情况下对负二进制数进行前导(1) 编码 而不是前导零(0)。
这意味着,如果您使用8位来表示您的二进制补码,则将处理 从0000 0000到0111 1111代表从0到127的数字并保留1xxx xxxx来代表负数
八位两位补码的数:
#位无符号值二进制补码值
0000 0000 0 0
0000 0001 1 1
0000 0010 2 2
0111 1110 126 126
0111 1111 127 127
1000 0000 128 -128
1000 0001 129 -127
1000 0010 130 -126
1111 1110 254 -2
1111 1111 255 -1
从本质上讲,这意味着1010 0110的无符号值为166(通过加(128 * 1)+(64 * 0)+(32 * 1)+(16 * 0)+(8 * 0)+(4 * 1)+(2 * 1)+(1 * 0)),它具有一个二进制补码值 -90(通过添加(128 * 1)-(64 * 0)-(32 * 1)-(16 * 0)(8 * 0)-(4 * 1)-(2 * 1)-(1 * 0),以及对值的补码)。
这样,负数的范围可以降至-128(1000 0000)。 Zero(0)表示为0000 0000,负号表示一(-1)为1111 1111,
这等同于〜n = -n-1:
# 0 = 0b0000 0000
~0
#输出: -1
#-1 = 0b1111 1111
# 1 = 0b0000 0001
~1
Out: -2
-2 = 1111 1110
2 = 0b0000 0010
~2
#输出: -3
#因为-3 = 0b1111 1101
#123 = 0b0111 1011
~123
#输出: -124
#因为 -124 = 0b1000 0100
注意,此操作应用于正数时的总体效果可以总结为:
~n -> -|n+1|
然后,当应用于负数时,相应的效果是:
~-n -> |n-1|
以下示例说明了最后一条规则:
#-0 = 0b0000 0000
~-0
#输出 -1
#-1 = 0b1111 1111
# 0是这个规则的例外,因为-0总是== 0
#-1 = 0b1000 0001
~-1
#输出: 0
#0 = 0b0000 0000
#-2 = 0b1111 1110
~-2
#输出: 1
#1 = 0b0000 0001
# -123 = 0b1111 1011
~-123
#输出: 122
#122 = 0b0111 1010
Bitwise AND 位操作:与
&操作符将执行二进制“与”操作,如果在两个操作数中都存在位,则复制该位。比如:
# 0 & 0 = 0
# 0 & 1 = 0
# 1 & 0 = 0
# 1 & 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 & 30
#输出: 28
#28 = 0b11100
bin(60 & 30)
#输出: 0b11100
Bitwise OR 位操作:或
‘|’操作符将执行一个二进制“or”,如果它存在于任何一个操作数中,那么就会复制一个位,比如:
# 0 | 0 = 0
# 0 | 1 = 1
# 1 | 0 = 1
# 1 | 1 = 1
#60 = 0b111100
#30 = 0b011110
60 | 30
#输出: 62
#62 = 0b111110
bin(60 | 30)
#输出: 0b111110
Bitwise Left Shift 位操作: 向左位移
‘<
#2 = 0b10
2 << 2
#输出: 8
#8 = 0b1000
bin(2 << 2)
#输出: 0b1000
执行1的左位移位相当于乘以2
7 << 1
#输出: 14
执行n的左位移位相当于乘以2**n :
3 << 4
#输出: 48
Bitwise Right Shift 位操作: 向右位移
‘>>’ 操作符将执行按位“右移”,即左操作数的值按右操作数提供的位数右移:
# 8 = 0b1000
8 >> 2
#输出: 2
# 2 = 0b10
bin(8 >> 2)
#输出: 0b10
执行1的右位移位等于2的整数除法 :
36 >> 1
#输出: 18
15 >> 1
#输出: 7
执行n的右位移位等于2**n的整数除法 :
48 >> 4
#输出: 3
59 >> 3
#输出: 7
重赋值操作
所有的位操作符(除了 ‘~’ ),都有固定的用法:
a = 0b001
a &= 0b010
#输出 a = 0b000
a = 0b001
a |= 0b010
#输出 a = 0b011
a = 0b001
a <<= 2
#输出 a = 0b100
a = 0b100
a >>= 2
#输出 a = 0b001
a = 0b101
a ^= 0b011
#输出 a = 0b110
禁止转载,违者必究!