1、基础操做it
1.a<<b基础
将二进制a左移b位,不够的地方用0补位原理
例如进阶
100<<2 == 10000二进制
2.a>>b集合
将二进制a右移b位移动
例如
100>>2 == 1
3.a|b
或操做(按位或),相同位中只要有一个1或者两个1则结果为1,全0则结果为0
4.a&b
与操做(按位与),相同位中只要都是1,则结果为1,若是一个为0一个为1或者都是0则结果为0。
5.a^b
异或,相同位只要一个1一个0,则结果为1;相同位二进制相同则结果为0 。
2、进阶操做
1.快速求2^n
1<<n == pow(2,n)
原理:1<<n的意思是1的二进制向左移动n位,则此数二进制形式变成了 100000...000(n个0),刚好是2^n
2.判断奇数偶数
n&1 == 1则为奇数
n&1 == 0则为偶数
原理:n&1的意思是n与1,那么n与1中,1除了右端位为1其余位都是0,则由与运算获得的结果中其余位一定都是0 。
因此最后获得的结果只与1的右端位和n的右端位有关,咱们知道1的右端位为1,那么n的右端位只有为1的时候与1进行与运算的结果是1;n的右端位只有为0的时候与1进行与运算的结果是0 。
显然二进制右端位为1的时候该数为奇数,为0时该数为偶数,因此得证。
3.lowbit
a&(-a) 表明着a的二进制的最后一位。
原理:涉及到二进制的补码知识,感兴趣的人能够本身了解。
3、高阶操做
1.a >> b & 1 表明着若是a的第b位为1则为真
用来判断二进制的某一位
原理:a左移b位,则a的右端位就是原来a的第b位,这时与1作与运算(1左边的0由与运算性质得没有影响)就能够得知这一位是1仍是0(1&1 == 1,0|1 == 0 )
2.a|(1<<n) 表明着将a的二进制的第n位设为1
原理:1<<n能够看做由一个1和n个0组成的二进制数,其中0的部分由或的性质(0|0==0,1|0==1)能够知道不会对二进制位产生影响。
而1的部分由或的性质(1|1==1,0|1=1)能够得出必定是1。
4、图论
x表示要判断的点,S表示集合
(1 << x) & S == true 即x在S集合里,若是为false则x不在S集合里
S = S | (1 << x) 表示S集合中加入了x点