记录一下位运算的常见操作
把x右边连续的1变成0:
x & (x + 1)
把x右边连续的0变成1:
x | (x - 1)
把x右边的第一个0变成1:
x | (x + 1)
取出x右边连续的1:
(x ^ (x + 1)) >> 1
遍历x的子集:
for (int i = x; i; i = (i - 1) & x) {
...
}
注意:这样遍历不会遍历到空集
x & (x + 1)
x | (x - 1)
x | (x + 1)
(x ^ (x + 1)) >> 1
for (int i = x; i; i = (i - 1) & x) {
...
}
注意:这样遍历不会遍历到空集