基本概念
- 原码: 最高位表示符号位的二进制数
- 反码: 正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
- 补码: 正数的补码就是其本身,负数的补码是在反码的基础上+1
正数的反码补码是一样的,计算机的计算都是使用补码来运算,计算的结果最终还需要转换为原码
与(&)运算 (相同位置都为1,则该位置是1,否则为0,正数补齐0,负数补齐1)
示例 1:
12 & 11
12的补码 01100
11的补码 01011
补码结果 01000
源码结果 01000
10进制结果 8
示例2:
12 & 3
12的补码 01100
3用于计算的补码 00011 (3的补码 011 正数补全0)
补码结果 00000
原码结果 00000
10进制结果 0
示例3:
12 & -3
12的补码 01100
-3用于计算的补码 11101 (-3的补码 101 负数补全1)
补码结果 01100
原码结果 01100
10进制结果 12
示例4:
3 & -11
3用于计算的补码 00011 (3的补码 011 正数补全0)
-11的补码 10101
补码结果 00001
原码结果 00001
10进制结果 1
或(|)运算(相同位置都为0,则该位置是0,否则为1,正数补齐0,负数补齐1)
示例1:
12 | 11
12的补码 01100
11的补码 01011
补码结果 01111
原码结果 01111
10进制结果 15
示例2:
12 | 3
12的补码 01100
3用于计算的补码 00011 (3的补码 011 正数补全0)
补码结果 01111
原码结果 01111
10进制结果 15
示例3:
12 | -3
12的补码 01100
-3用于计算的补码 11101 (-3的补码 101 补全1)
补码结果 11101
原码结果 10011
10进制结果 -3
示例4:
3 | -11
3用于计算的补码 00011 (3的补码011 补全0)
-11的补码 10101
补码结果 10111
原码结果 11001
10进制结果 -9
异或(^) (相同位置值不同为1,否则为0,正数补齐0,负数补齐1)
示例1:
12 ^ 11
12的补码 01100
11的补码 01011
补码结果 00111
原码结果 00111
10进制结果 7
示例2:
12 ^ 3
12的补码 01100
3用于计算的补码 00011
补码结果 01111
原码结果 01111
10进制结果 15
示例3:
12 ^ -3
12的补码 01100
-3用于计算的补码 11101 (-3的补码 101 补全1)
补码结果 10001
原码结果 11111
10进制结果 -15
示例4:
3 ^ -11
3用于计算的补码 00011 (3的补码011 补全0)
-11的补码 10101
补码结果 10110
原码结果 11010
10进制结果 -10
取反(~)(包括符号位所有位置均取反,1变0,0变1)
示例1:
~12
12的补码 01100
补码结果 10011
原码结果 11101
10进制结果 -13
示例2:
~-12
-12的补码 10100
补码结果 01011
原码结果 01011
10进制结果 11
左移(<<) (让操作数乘以2的n次幂,2进制表示则为后补n个0)
示例1:
12 << 2
12的补码 01100
补码结果 0110000
原码结果 0110000
10进制结果 48
示例2:
-12 << 2
-12的补码 10100
补码结果 1010000
原码结果 1110000
10进制结果 -48
右移(>>)(让操作数除以2的n次幂,2进制表示则为剔除n个0,不够,正数补0,负数补1,一定要有符号位)
示例1:
12 >> 2
12的补码 01100
补码的结果 011
原码结果 011
计算结果 3
示例2:
3 >> 2
3的补码 011
补码结果 00
原码结果 00
计算结果 0
示例3:
-3 >> 2
3的补码 101
补码结果 11 (负数位不够补1)
原码结果 11
计算结果 -1
示例4:
-12 >> 2
-12的补码 10100
补码结果 101
原码结果 111
10进制结果 -3
无符号右移(>>>) (正数与右移无差,负数需要先补全到32位,剔除n位,则前补n个0)
示例1:
12 >>> 2
12的补码 01100
补码的结果 011
原码结果 011
计算结果 3
示例2:
3 >>> 2
3的补码 011
补码结果 00
原码结果 00
计算结果 0
示例3:
-3 >>> 2
-3的补码 11111111111111111111111111111101 (负数需要补1到32位)
补码结果 00111111111111111111111111111111
原码结果 00111111111111111111111111111111
计算结果 1073741823
示例4:
-11 >>> 2
-11的补码 11111111111111111111111111110101 (负数需要补1到32位)
补码结果 00111111111111111111111111111101
原码结果 00111111111111111111111111111101
计算结果 1073741821
注意没有无符号左移