定义
运算名 | 符号 | 效果 |
---|---|---|
按位与 | & | 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 |
按位或 | l | 两个相应的二进制位中只要有一个为1,该位的结果值为1 |
按位异或 | ^ | 若参加运算的两个二进制位值相同则为0,否则为1 |
取反 | ~ | 对一个二进制数按位取反,即将0变1,将1变0 |
左移 | << | 用来将一个数的各二进制位全部左移N位,右补0 |
右移 | >> | 将一个数的各二进制位右移N位,移到右端 的低位被舍弃,对于无符号数,高位补0 |
性质及应用
左移 <<
每左移一位相等于乘上2
右移 >>
每右移一位相当于除于2
按位与 &
-
判断a的第j位是0还是1:若a&(1<<j)为正,该位是1;否则该位为0。
-
每执行一次a=a&(a-1),会将a用二进制表示时最右边的一个1变为0
for(int s = sta; s; s = (s - 1) & sta) //枚举出sta的所有子集
-
如果需要判断一个数a是否为2的次幂,只需要计算出a&(a-1)的值,如果是0的话该数是2的次幂,反之则反之
-
取一个数a的最底位的1,用a&-a, 例如20(10) = 10100(2),那么20&-20 = 100(2);
按位异或 ^
-
如果需要将a的第j位取反的话,只需要进行 a^(1<<j)即可;
-
利用自反性交换两个数,按位异或有个很神奇的性质–自反性 a ^ b ^ b = a;
利用这个性质我们可以不用第三个变量就能交换两个数; 例如:我们要交换a和b两个,只需要进行以下操作即可;a = a ^ b;b = a ^ b;a = a ^ b;
-
满足:
交换律 a ^ b==b ^ a
结合律 (a ^ b) ^ c == a ^ (b ^ c)
对于任何数x,都有 x ^ x=0,x^0=x
若a ^ b=c,则a ^ c=b
按位或 l
- 可以将a的第j位变为1,用a|(1<<j)即可
update:
- a&b<=a+b
- “且”的符号:∧ ;“或”的符号:∨ ;“异或”的符号:⊕
- a ⊕ b = (¬a ∧ b) ∨ (a ∧ ¬b)
- a+b=(a|b)+(a&b)
- a|b=(a&b)+(a^b)