二进制的基础
and & (按位取与) 1 & 1 = 1 1 & 0 = 0 0 & 0 = 0 0 & 1 = 0
or | (按位取或) 1 | 1 = 1 1 | 0 = 1 0 | 0 = 0 0 | 1 = 0
xor ⊕/^ (按位异或) 1⊕1 = 0 1⊕0 = 1 0 ⊕0 = 0 0 ⊕1 = 0
lsh << (逻辑左移)将二进制数向左移动x位造成二进制数右边不足用0补足,左边高位溢出
rsh >> (逻辑右移)将二进制数向右移动y位造成二进制数左边补足用0补足,右边高位溢出
not ~ (按位取反) 每一位0变1,1变0
注意:二进制操作的优先级好像很低,所以进行计算时可以多打写括号反正又不会累死
二进制的基本操作
读取x的第pos个二进制位: (x >> pos)& 1;
读取x的第pos位开始的cnt位: (x >> pos)& ((1 << cnt) - 1);
将x的第pos位置为1: (1 << pos)| x;
将x的第pos位置为0: (~(1 << pos))& x;
将x的第pos位取反: (1 << pos) ⊕ x;
将x的末尾的1提取出来: x & (x ⊕ (x + 1));
二进制中最低位的一个1的位置: lowbit(x) = x & (-x);
遍历二进制中所有的1的位置: for(; x; x -= lowbit(x));
判断一个数的奇偶性: (x & 1) ? 偶数 : 奇数;
对2的幂取模 : x & ((1 << y) - 1)
二进制表示集合
枚举子集 for(int i = x; i ; i = (i & (i - 1));