1.通用的「枚举二进制子集」的方法,伪代码:
function get_subset(bitmask) subset = bitmask answer = [bitmask] while subset != 0 subset = (subset - 1) & bitmask put subset into the answer list end while return answer end function
其中bitmask 表示一个二进制数,subset 会遍历所有 bitmask 的子集,并将所有的子集放入 answer 中。需要注意的是,bitmask 本身也是 bitmask 的一个子集,因此 answer 在初始时就包含 bitmask 本身。
2. x&(x - 1) 将x的二进制表示中右边第一个1置0
x: 0010,0101,0000 x−1: 0010,0100,1111 x&(x−1): 0010,0100,0000