常见位运算

常用

__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

原文地址:https://www.cnblogs.com/yvzhu/p/14721631.html