&(按位与)
把两个数字的所有的二进制位相与
1&1=1 1&0=0 0&0=0 0&1=0
|(按位或)
把两个数字所有的二进制位相或
1|1=1 1|0=1 0|0=0 0|1=1
~(按位取反)
把一个数字的所有二进制位取反
~1=0 ~0=1
^(按位异或)
把两个数字的所有二进制位异或
1 ^ 1=0 1 ^ 0=1 0 ^ 1=1 0 ^ 1=1
public class hello {
public static void main(String[] args) {
int i = -3;
int j = 11;
int k = i & j;
/* 3: 0000 0011 取反 1111 1100 加1: 1111 1101(-3的二进制 3的反码加一即补码)
11的二进制代码是: 0000 1011
*/
System.out.printf("%d\n",k);
}
}
结果为9
1111 1101 (-3)
0000 1011(11)
0000 1001(9)
右移>>
在Java中右移没有任何歧义,这与C/C++不同。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位0,最高位补0,而为负数时,最高位为1,最高位补1
>>>
无论最高位是0还是1,右边移动的改为都补0
<< 和 <<<同理
System.out.println(8>>1); //8/2=4
System.out.println(8>>2); //8/4=2
System.out.println(8>>3); //8/8=1
即右移一位/2的一次方 ,右移二位/2的二次方~~~