总结下位运算的相关内容
- 并
A|B - 交 A&B
- 减法 A&~B(即是求解A中不包括B的部分)
- 求反 ~A
- 设置某一位为1 A |= 1 << n
- 清除其他位为0:A &= ~(1 << n)
- 测试第n位是否为0:A &(1 << n) == 0
- 抽取最后一位 A & -A or A&~(A-1)
- 移除最后一位 A&(A-1) 示例:
统计给定数有多少位
1
2
3
4
5
6int count(n):
count = 0
while n:
n = n & (n - 1)
count += 1
return count判断某个数是否是4的指数
1 | def is_power_four(n): |
^的使用trick
使用^删除完全相同的数字并保存奇数,或保存不同的位并删除它们。
- 求解两个数的和
1 | def get_sum(a, b): |
使用|的使用trick
可以保留尽量多的1位
翻转数字的位1
2
3
4
5
6
7def reverse(n):
mask = 1 << 31
res = 0
for i in range(32):
if n >> i & 1 == 1:
res |= (mask >> i)
return res
&的tirck
可以用来选择特定的位
求解一位unsigned int有多少位是11
2
3
4
5
6def hammingweight(n):
count = 0
while n:
n &= (n - 1)
count += 1
return count