常见位运算
常用
__builtin_ffs(x)
返回x的最后一位1是从后向前第几位
__builtin_popcount(x)
返回x的二进制下1的个数
x&-x
只保留最后一位1的二进制
x = x & (x - 1)
清零最低位的1
x & 1
判断奇偶
x |= 1 << n
将第n位置1
x &= !(1 << n)
将第n位置0
x ^ (1 << (k - 1))
对x的第k位取反
for(int i = x;i;x&(i - 1))
遍历所有x的1的子集,如5的子集:[1,4,5]。3的子集:[1,2,3]
x >> n & 1
判断第n位的奇偶
进阶
__builtin_parity(x)
返回x的二进制下1的个数的奇偶性
__builtin_clz(x)
返回x的二进制下前导的0的个数
__builtin_ctz(x)
返回x的二进制下末尾的0的个数
x & (~0 << n)
将最后n位变成0
x & (x + 1)
去掉右边连续的1
x & (x ^ ( x - 1))
去掉右起第一个1的左边
(x ^ (x + 1) >> 1)
取右边连续的1