按位与 &
按位或 |
按位异或 ^
按位取反 ~
左移<<
右移>>
A | B | A&B | A|B | A^B |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
按位与可以类比&&运算符来记
按位或可以类比||运算符来记
按位异或可以用"相同为0,相异为1"
左移相等于乘上2,右移相当于除于2;
最常用就是以上五种;
按位与&可以用来判断特定的位是1还是0;
按位与&: (j从0开始)
1.如果我要判断a的第j为是0还是1的话,只需要计算出a&(1<<j)
因为01得1 11得1 所以值是非0则a的第 j位为1,如果是0的话该位就是0
2.如果需要判断一个数a是否为2的次幂,只需要计算出a&(a-1)的值,如果是0的话该数是2的次幂,反之则反之
因为一个数 是2的幂次的话 二进制只会有一个1 因为二进制已经把2的0次方 1次方 2次方 一位位表示 6=2的2次方+2的1次 方 6并不是2的次幂,而(a-1) 假设a为00100 那(a-1)就是00011 这两个数& 一定得0
3.取一个数a的最底位的1,用a&-a,例如20(10) = 10100(2),那么20&-20 = 100(2); 线段树
4.可以将a的第j位变为0,用a&(0<<j)即可
按位异或^
1.如果需要将a的第j为取反的话,只需要进行 a^(1<<j)即可;
2.利用自反性交换两个数,按位异或有个很神奇的性质--自反性 a^b^b = a;
利用这个性质我们可以不用第三个变量就能交换两个数;
例如:我们要交换a和b两个,只需要进行以下操作即可;
a = a ^ b; 比如10 和 11(基于二进制) a = a^b = 01 b = a^b = 10 a = a^b = 11
b = a ^ b;
a = a ^ b;
按位或:
1.可以将a的第j位变为1,用a|(1<<j) 00得0 01得1即可
--------------------- 本文来自 糖宋元明清 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/u013377068/article/details/81028453?utm_source=copy
x & (x << 1) 判断有没有相邻1 010 &100=000 011&110=010 0的话没有相邻1 反之