位(bit)就是单个的0或1,位是我们在计算机上所作一切的基础。计算机上的所有数据都是用位来存储的。 首先我们来看一下什么是与运算、或运算与异或运算:
与运算: & 当条件都为真时,才为真。
1 & 1 = 1;1 & 0 = 0;
0 & 0 = 0;
或运算: | 当有一个条件为真时,即为真
1 | 1 = 1;1 | 0 = 1;0 | 0 = 0;
异或运算: ^ 当相等是为0,不相等时为1 (字面上来解释,异或就是不相等时,做或运算,即不相等时为1,相等就默认为0了)
1^1=0
1^0=1
0^0=0
Python中按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:
按位与 ( bitwise and of x and y ) & 举例:
5&3 = 1 解释: 101 11 相同位仅为个位1 ,故结果为 1
按位或 ( bitwise or of x and y ) | 举例:
5|3 = 7 解释: 101 11 出现1的位是 1 1 1,故结果为 111
按位异或 ( bitwise exclusive or of x and y ) ^ 举例:
5^3 = 6 解释: 101 11 对位相加(不进位)是 1 1 0,故结果为 110
按位反转 (the bits of x inverted ) ~ 举例:
~5 = -6 解释: 将二进制数+1之后乘以-1,即~x = -(x+1),-(101 + 1) = -110
按位反转仅能用在数字前面。所以写成 3+~5 可以得到结果-3,写成3~5就出错了。
按位左移(x shifted left by n bits)<< 举例:
5<<2 = 20 解释:101向左移动2位得到10100,即右面多出2位用0补。
按位右移 ( x shifted right by n bits)>> 举例:
5>>2 = 1 解释:101 向右移动2位得到 1,即去掉右面的2位
在优先级方面,取反运算符~跟算术运算符中的单目运算符(即
只有一个操作数参加运算)同级,并且是所有位运算符中优先级最高的;然后是移位运算符(左移<<和右移>>),它们比取反运算符和算术运算中的加减运算符低;最后是逐
位与、或和异或运算符。
各位运算符按照优先级有高到低排列如下所示:
取反运算符 > 左移运算符 > 右移运算符 > 按位与运算符 > 按位异或运算符 >
按位或运算符 在位运算符中,取反运算符(单目运算符)~的结合性是从右向左结合,其余双目运算符的结合性是从左向右结合。 下面是直接可以运行的代码,具体运行一下
,会对Python中的位运算体会得更深一些。注意,因为Python是弱类型的编程语言,所以没有其它进制的数值表示,都是以字符串的形式来表现的。# -- coding:utf-8 -
'''
对整数转换成的二进制字符串进行格式化
'''
def formatbin(int_val):
str_val = bin(int_val)
if str_val.startswith('-'):
return(str_val[0:1] + str_val[3:])
return(str_val[2:])
val_a = 53
val_b = 26
val_c = val_a & val_b
print( ' ' * 3 + formatbin(val_a).zfill(6))
print( '& ' + formatbin(val_b).zfill(6))
print('-' * 9)
print(' ' * 3 + formatbin(val_c).zfill(6))
print
val_c = val_a | val_b
print( ' ' * 3 + formatbin(val_a).zfill(6))
print( '| ' + formatbin(val_b).zfill(6))
print('-' * 9)
print(' ' * 3 + formatbin(val_c).zfill(6))
print
val_c = val_a ^ val_b
print( ' ' * 3 + formatbin(val_a).zfill(6))
print( '^ ' + formatbin(val_b).zfill(6))
print('-' * 9)
print(' ' * 3 + formatbin(val_c).zfill(6))
print
val_c = ~ val_a
print( '~ ' + formatbin(val_a).zfill(6))
print('-' * 9)
print(' ' * 2 + formatbin(val_c).zfill(6))
print
val_c = val_a >> 1
print( '>> ' + formatbin(val_a).zfill(6))
print('-' * 9)
print(' ' * 4 + formatbin(val_c).zfill(5))
print
val_c = val_a << 1
print( '<< ' + formatbin(val_a).zfill(6))
print('-' * 9)
print(' ' * 2 + formatbin(val_c).zfill(6))