通常状况下,编写web应用可能不多接触到位运算场景,可是一旦编写偏底层的框架如hadoop ipc、lucene、数据压缩等位运算必须熟练掌握。java
一、按位取反(~)web
将每一个位的值1变0,0变1。如byte val=1; 那么~val=-2。因为java采用补码,若是须要获得正数的负数就须要将正数按位取反再加1,能够验证-val=~val+1=-1。框架
二、按位异或(^)oop
只有位的值不一样才等于1不然为0。如0000_0001^0000_0010=0000_0011。小技巧a ^ -1 ^ -1 =a,在zigzag编码中有实际应用。编码
三、按位与(&)ip
只有位上值都为1时才等于1不然为0。 0&0=0; 1&1=1; 1&0=0; 0&1=0;hadoop
四、按位或(|)技巧
其中有一位数值为1结果等于1不然为0。1 | 0=1;0 | 1=1;0|0=0; 1| 1=1;lucene
五、移位运算数据
无论是左移、右移、仍是无符号右移,对于移动的位数超过32或者64时,都是对32或者64取余后的数进行移位的。右移至关于做除法运算不会改变运算符号,正数右移到最后会变成0,负数右移到最后会变成-1。无符号右移对于负数而言就不一样了,由于它始终在最前面补0,那么负数最后会变成正数,移到最后也会变成0。