位运算
众所周知,位运算是一种很强大的运算,在 OI 中有非常广泛的运用。
绝对不是状压把我心态写崩了
对于数字
-
(1<<n)代表 \(2^n\) -
x<<1代表 \(2\times x\) -
x>>1代表 \(\left\lfloor \frac{x}{2}\right\rfloor\) -
x&1结果为 \(1\) 代表奇数,为 \(0\) 代表偶数 -
x^1表示将奇数变为偶数(\(-1\)),偶数变为奇数(\(+1\)) -
(1<<i)&x表示若 \(x\) 的第 \(i\) 位为 \(1\) 则值为 \(1\),否则为 \(0\) -
数出 \(x\) 的二进制表示中 \(1\) 的个数
int cnt=0; while(x){ x&=(x-1); cnt++; } -
x&(-x)返回 \(x\) 最低为 \(1\) 的位所对应的值(lowbit)
对于集合
-
\(0\) 表示无此元素,\(1\) 表示有此元素
-
A&B代表 \(A\cap B\) -
A|B代表 \(A\cup B\) -
A^B代表 \(A-B\) -
A&(1<<i)值为 \(1\) 代表集合 \(A\) 中有编号为 \(i\) 的元素 -
for(int s=0;s<(1<<n);++s)直接枚举子集 -
for(int s1=s;s1;s1=s&(s1-1))间隔枚举子集
未完待续...

浙公网安备 33010602011771号