概念:一个int(整型)有32位,那么就可以表示0到31的数字,那个位置为1,就代表存在那个值。
class Bitset { public: int* set; int ones ; int zeros ; //用 size 个位初始化 Bitset ,所有位都是 0 。 Bitset(int size) { set = new int[size+31/32]; ones = 0; zeros = size; } //将下标为 idx 的位上的值更新为 1 。如果值已经是 1 ,则不会发生任何改变。 void fix(int idx) { int n = (1 << idx % 32); if ((idx&1)==0) { ones++; zeros--; } set[idx / 32]&=n; } //将下标为 idx 的位上的值更新为 0 。如果值已经是 0 ,则不会发生任何改变 void unfix(int idx) { int n = (1 << idx % 32); if ((idx & 1) != 0) { ones--; zeros++; } set[idx / 32] &= ~(1 << idx % 32); //查看idx位上是否为0的另一种写法 //(set[idx/32]>>(idx%32))&1==0 } //翻转 Bitset 中每一位上的值。换句话说,所有值为 0 的位将会变成 1 ,反之亦然。 void flip() { for (int i=0;i<sizeof(*set)/sizeof(int);i++) { set[i] ^= 0xFFFFFFF; } int tmp = ones; ones = zeros; zeros = tmp; } //检查 Bitset 中 每一位 的值是否都是 1 。如果满足此条件,返回 true ;否则,返回 false 。 bool all() { return zeros == 0; } //检查 Bitset 中 是否 至少一位 的值是 1 。如果满足此条件,返回 true ;否则,返回 false bool one() { return ones > 0; } //返回 Bitset 中值为 1 的位的 总数 int count() { return ones; } //返回 Bitset 的当前组成情况。注意,在结果字符串中,第 i 个下标处的字符应该与 Bitset 中的第 i 位一致。 //把每一位向右运动到第一位,然后&1,为0就证明这位就是0,加到str中。 string toString() { string str; for (int i=0;i<sizeof(*set)/sizeof(int);i++) { for (int j=0;i<32;j++) { if ((set[i]>>i)&1==0) { str.append("0"); } else { str.append("1"); } } } return str; } };