正数:正数的原码、反码、补码都一样(三码合一)负数:负数的反码 = 它的原码除符号位外其他按位取反(0取1,1取0);负数的补码 = 它的反码 + 10的反码、补码都是0
特别说明:
1、java没有无符号数,java中的数都是有符号的
2、二进制数的最高位表示符号位,0表示正数,1表示负数
3、计算机中的运算都是以补码的方式来计算的,但我们看运算结果时要看原码
java中有7个位运算符:&、|、^、~、>>、<<、>>>
按位与&:两位均为1,则结果为1,否则为0按位或|:两位中至少有一个为1,则结果为1,否则为0按位异或^:两位中一个为1,另一个为0,则结果为1,否则为0按位取反~:1变0,0变1算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位算术左移<<:符号位不变,低位补0逻辑右移>>>:也叫无符号右移,低位溢出,高位补0
特别说明:没有 “<<<” 这个位运算符
示例以下示例均以 int 数据类型进行举例。
1、按位与&
2&3 => 2
00000000 00000000 00000000 00000010 //三码合一,直接运算
00000000 00000000 00000000 00000011
————————————————————————————————————
00000000 00000000 00000000 00000010 //正数,三码合一,2
-2&3 => 2
10000000 00000000 00000000 00000010 //原码
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111101 //反码
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111110 //补码运算
00000000 00000000 00000000 00000011
————————————————————————————————————
00000000 00000000 00000000 00000010 //正数,三码合一,2
2、按位或|
2|3 => 3
00000000 00000000 00000000 00000010 //三码合一,直接运算
00000000 00000000 00000000 00000011
————————————————————————————————————
00000000 00000000 00000000 00000011 //正数,三码合一,3
-2|3 => -1
10000000 00000000 00000000 00000010 //原码
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111101 //反码
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111110 //补码运算
00000000 00000000 00000000 00000011
————————————————————————————————————
11111111 11111111 11111111 11111111 //负数补码
=> 11111111 11111111 11111111 11111110 //负数反码
=> 10000000 00000000 00000000 00000001 //负数原码,-1
3、按位异或^
2^3 => 1
00000000 00000000 00000000 00000010 //三码合一,直接运算
00000000 00000000 00000000 00000011
————————————————————————————————————
00000000 00000000 00000000 00000001 //正数,三码合一,1
-2^3 => -3
10000000 00000000 00000000 00000010 //原码
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111101 //反码
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111110 //补码运算
00000000 00000000 00000000 00000011
————————————————————————————————————
11111111 11111111 11111111 11111101 //负数补码
=> 11111111 11111111 11111111 11111100 //负数反码
=> 10000000 00000000 00000000 00000011 //负数原码,-3
4、按位取反~
~2 => -3
00000000 00000000 00000000 00000010 //三码合一,直接运算
————————————————————————————————————
11111111 11111111 11111111 11111101 //负数补码
=> 11111111 11111111 11111111 11111100 //负数反码
=> 10000000 00000000 00000000 00000011 //负数原码,-3
~-2 => 1
10000000 00000000 00000000 00000010 //原码
=> 11111111 11111111 11111111 11111101 //反码
=> 11111111 11111111 11111111 11111110 //补码运算
————————————————————————————————————
00000000 00000000 00000000 00000001 //正数,三码合一,1
5、算术右移>>
1>>2 => 0
00000000 00000000 00000000 00000001 //三码合一,直接运算
————————————————————————————————————
00000000 00000000 00000000 00000000 //0的三码均为0
-1>>2 => -1
10000000 00000000 00000000 00000001 //原码
=> 11111111 11111111 11111111 11111110 //反码
=> 11111111 11111111 11111111 11111111 //补码运算
————————————————————————————————————
11111111 11111111 11111111 11111111 //负数补码
=> 11111111 11111111 11111111 11111110 //负数反码
=> 10000000 00000000 00000000 00000001 //负数原码,-1
6、算术左移<<
1<<2 => 4
00000000 00000000 00000000 00000001 //三码合一,直接运算
————————————————————————————————————
00000000 00000000 00000000 00000100 //正数,三码合一,4
-1<<2 => -4
10000000 00000000 00000000 00000001 //原码
=> 11111111 11111111 11111111 11111110 //反码
=> 11111111 11111111 11111111 11111111 //补码运算
————————————————————————————————————
11111111 11111111 11111111 11111100 //负数补码
=> 11111111 11111111 11111111 11111011 //负数反码
=> 10000000 00000000 00000000 00000100 //负数原码,-4
7、逻辑右移>>>
3>>>2 => 0
00000000 00000000 00000000 00000011 //三码合一,直接运算
————————————————————————————————————
00000000 00000000 00000000 00000000 //0的三码均为0
补充说明:由于正数三码合一的原则,以及基于算术左移和右移的运算规则,我们不难发现,对于正数而言,进行算术右移即除以相应的2的指数幂,进行算术左移即乘以相应的2的指数幂。(日后可以采用这种方法进行快速运算。)
例如:
8>>2 = 8/4 = 2
8<<2 = 8×4 = 32
5>>1 = 5/2 = 2
5<<1 = 5×2 = 10



