原码
数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011; -3为1000 0011。
注意,Java中int为32位。3的16进制表示为3,-3的16进制为fffffffd.
反码
正数的反码和原码相同。
负数的反码为符合位不变,其余按位取反。
3 为0000 0011; -3为1111 1100。
补码
正数的补码和原码相同。
负数的补码为反码+1.
3 为0000 0011; -3为1111 1101
与(&)
按位与,位数对齐,全部为1的结果为1.
1&2 == 0                2&3 ==  2
0000 0001               0000 0010
0000 0010               0000 0011
---------               ---------
0000 0000               0000 0010
或(|)
按位或,位数对齐,只要有一个为1,则结果为1
1|2 == 3                2|3 ==  3
0000 0001               0000 0010
0000 0010               0000 0011
---------               ---------
0000 0011               0000 0011
非(~)
按位取反。
~1 == -2
0000 0001              
---------              
1111 1110              
我们直到负数的表示为反码+1. 所以,该结果中的反码为(1111 1110 - 0000 0001)=1111 1101,则绝对值原码为0000 0010, 即2。即结果为-2.
异或(^)
相同为假,不同为真。
1^2 == 3                2^3 ==  1
0000 0001               0000 0010
0000 0010               0000 0011
---------               ---------
0000 0011               0000 0001
左移 <<
所有的位左移,低位即右侧补0.
1<<2 == 4               3<<3 == 24
0000 0001               0000 0011
0000 0100               0001 1000
左移几位则相当于10进制乘以2的多少次方。所以1<<2==1*2*2==4;   3<<<3==3*2*2*2==24
右移 >>
正数右移,高位用0补,负数右移,高位用1补.
1>>2 == 0            13>>2 ==3           -3>>2 == -1     
0000 0001            0000 1101           1111 1101
---------            ---------           ---------
0000 0000            0001 0011           1111 1111
无符号右移 >>>
正数无符号右移同右移,负数无符号右移则高位补0.
1>>>2 == 0            13>>>2 ==3           -3>>>2 == 1073741823
0000 0001            0000 1101           fffffffd
---------            ---------           ---------
0000 0000            0001 0011           3fffffff
衍生运算符
由位运算操作符衍生而来的有:
&= 按位与赋值
|=  按位或赋值
^= 按位非赋值
>>= 右移赋值
>>>= 无符号右移赋值
<<= 赋值左移