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

3. x&(~x+1) 得到x最右侧不等于0的位