位运算

众所周知,位运算是一种很强大的运算,在 OI 中有非常广泛的运用。
绝对不是状压把我心态写崩了

对于数字

  1. (1<<n) 代表 \(2^n\)

  2. x<<1 代表 \(2\times x\)

  3. x>>1 代表 \(\left\lfloor \frac{x}{2}\right\rfloor\)

  4. x&1 结果为 \(1\) 代表奇数,为 \(0\) 代表偶数

  5. x^1 表示将奇数变为偶数(\(-1\)),偶数变为奇数(\(+1\)

  6. (1<<i)&x 表示若 \(x\) 的第 \(i\) 位为 \(1\) 则值为 \(1\),否则为 \(0\)

  7. 数出 \(x\) 的二进制表示中 \(1\) 的个数

    int cnt=0;
    while(x){
    	x&=(x-1);
    	cnt++;
    }
    
  8. x&(-x) 返回 \(x\) 最低为 \(1\) 的位所对应的值(lowbit)

对于集合

  1. \(0\) 表示无此元素,\(1\) 表示有此元素

  2. A&B 代表 \(A\cap B\)

  3. A|B 代表 \(A\cup B\)

  4. A^B 代表 \(A-B\)

  5. A&(1<<i) 值为 \(1\) 代表集合 \(A\) 中有编号为 \(i\) 的元素

  6. for(int s=0;s<(1<<n);++s) 直接枚举子集

  7. for(int s1=s;s1;s1=s&(s1-1)) 间隔枚举子集
    未完待续...

posted @ 2021-05-14 22:10  endlessloop  阅读(77)  评论(0)    收藏  举报