常用的有 判断奇偶 &
if(a & 1)== 1 则a是奇数 if (a&1) == 0 则 a是偶数
>> a >> = n 相当于 a / 2^ n
<< a <<= n 相当于 a*2^n
a ^= b ^= a ^= b 交换两个变量的值 如果有0则不能交换
与(&) | 0 & 0 = 0 | 1 & 0 = 0 | 0 & 1 = 0 | 1 & 1 = 1 |
或(|) | 0 | 0 = 0 | 1 | 0 = 1 | 0 | 1 = 1 | 1 | 1 = 1 |
异或(^) | 0 ^ 0 = 0 | 1 ^ 0 = 1 | 0 ^ 1 = 1 | 1 ^ 1 = 0 |
运算符 含义 描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
位运算枚举01字符串 在poj3279上需要枚举第一行的所有状态 一共2^n种 因为只有01两周状态 所以有天然二进制的优势
0~ 15的进制就是所有状态, 比如 当 n = 4时 枚举5的情况
5 转换为二进制为0101 直接转换为二进制比较麻烦所以可以 先 5 & 1 判断最后一位的01情况 然后 5 >> 2 去掉最后一位 进而判断倒数第二位的情况 然后就可以枚举所有情况
for (int i=0; i<1<<n; i++)
{
met (flip, 0);
for (int j=0; j<n; j++)
{
flip[0][n-j-1] = i >> j & 1;
}
}