与运算是两个值的运算,只有两者都为1,结果才为1,否则结果为0。
a | b | a&b |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 0 | 0 |
0 | 1 | 0 |
应用实例
掩码
掩码的典型例子就是子网掩码,其利用了与运算来计算 IPv4 地址的网络地址。
如 172.16.10.33/27
中的172.16.10.33
为 IPv4 地址,27为子网掩码中1的长度,剩余5位为0。其网络地址计算方法为:
1
2
3
10101100 00010000 00001010 00100001 # 172.16.10.33 转换为二进制
11111111 11111111 11111111 11100000 # 子网掩码转换为二进制
10101100 00010000 00001010 00100000 # 与计算结果,转换为可读的十进制即为 172.16.10.32
从而得知网络地址为 172.16.10.32
。
判断整数奇偶
对于任何一个奇数 a,有 a&1
=1。
对于任何一个偶数 a,有 a&1
=0。
如:
1
2
3
4
5
# 7&1
111 & 001= 1
# 6&1
110 & 001 =0
验证整数是否是2的n次方
对于任意一个2的整数次幂 a ,有 a&(a-1)=0
。
如:
1
2
3
4
5
# 14!=0,15不是2的整数次幂
15&(15-1)=14
# 0=0,16是2的整数次幂
16&(16-1)=0
计算整数的二进制中1的个数
1
2
3
4
5
6
7
8
9
10
11
12
13
def get_1_count(num):
count = 0
while num:
count += 1
num &= num - 1
return count
if __name__ == '__main__':
n = 135
print(n) # 135
print("{0:b}".format(n)) # 10000111
print(get_1_count(n)) # 4
取int型值的指定位的值
一个比特位和1与运算,结果为比特位的值。
那么,取一个int值 a 的第k位(从左往右,k从1开始)可以用 a>>k&1
。
如:
1
2
3
4
5
6
7
# 取数值17的第3位
00010001>>3 =00010
00010&00001 =00000 # 0 即为结果
# 取数值17的第4位
00010001>>4 =0001
0001&0001 =0001
将int型值的指定位置清0
方法就是先找到第k位,再和0进行与运算即可,a&~(1<<k)
。
如将17的二进制第4位置为0,17&~(1<<4)
=1
去除二进制表示中的最后一个1
对于整数 n,去除二进制表示中的最后一个1 可使用 n&(n-1)
。
过程示意如下: