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

京公网安备 11010502036488号