原码
正数:将其绝对值转换为二进制数,即为原码
负数:将其绝对值转换为二进制数,最高位 (符号位) 补1,即为原码
反码
正数:与原码相同
负数:该数的原码,除符号位,其余取反(0->1 1->0)。
补码
正数:与原码、反码相同
负数:该数的原码,除符号位,其余取反(0->1 1->0),最后 1 位 加 1。
十进制: 201
二进制原码: 00000000 00000000 00000000 11001001
二进制反码: 00000000 00000000 00000000 11001001
二进制补码: 00000000 00000000 00000000 11001001
十进制: -201
二进制原码: 10000000 00000000 00000000 11001001
二进制反码: 11111111 11111111 11111111 00110110
二进制补码: 11111111 11111111 11111111 00110111
十进制: 171
二进制原码: 00000000 00000000 00000000 10101011
二进制反码: 00000000 00000000 00000000 10101011
二进制补码: 00000000 00000000 00000000 10101011
十进制: -171
二进制原码: 10000000 00000000 00000000 10101011
二进制反码: 11111111 11111111 11111111 01010100
二进制补码: 11111111 11111111 11111111 01010101
与运算(&)
同为1为1,否则为0 (0&0=0、0&1=0 、 1&0=0 、1&1=1)
注:负数,需要先转换成补码,将计算后的补码,再进行转换回去
int res1 = 201 & 171; // 结果为:十进制137
int res2 = 201 & -171; // 结果为:十进制65
00000000 00000000 00000000 11001001 201的补码
& 00000000 00000000 00000000 10101011 171的补码
---------------------------------------
00000000 00000000 00000000 10001001 正数137
00000000 00000000 00000000 11001001 201的补码
& 11111111 11111111 11111111 01010101 -171的补码
---------------------------------------
00000000 00000000 00000000 01000001 正数65
或运算(|)
同为0,才为0,否则为1(0&0=0、0&1=1 、1&0=1、1&1=1)
注:负数,需要先转换成补码,将计算后的补码,再进行转换回去
int res1 = 201 | 171; // 结果为:十进制235
int res2 = 201 | -171; // 结果为:十进制-35
00000000 00000000 00000000 11001001 201的补码
| 00000000 00000000 00000000 10101011 171的补码
---------------------------------------
00000000 00000000 00000000 11101011 正数235
00000000 00000000 00000000 11001001 201的补码
| 11111111 11111111 11111111 01010101 -171的补码
---------------------------------------
11111111 11111111 11111111 11011101 补码
11111111 11111111 11111111 11011100 反码
10000000 00000000 00000000 00100011 原码
-35 负数
异或运算(^)
不同为1,否则为0(0&0=0、0&1=1 、1&0=1、1&1=0)
这里是进行的反转操作,n 和 1 进行异或运算,会反转
注:负数,需要先转换成补码,将计算后的补码,再进行转换回去
int res1 = 201 ^ 171; // 结果为:十进制 98
int res2 = 201 ^ -171; // 结果为:十进制 -100
00000000 00000000 00000000 11001001 201的补码
^ 00000000 00000000 00000000 10101011 171的补码
---------------------------------------
00000000 00000000 00000000 01100010 98的补码
00000000 00000000 00000000 11001001 201的补码
^ 11111111 11111111 11111111 01010101 -171的补码
---------------------------------------
11111111 11111111 11111111 10011100 补码
11111111 11111111 11111111 10011011 反码
10000000 00000000 00000000 01100100 原码
-100 负数
取反(~)
对每一位进行取反
注:负数,需要先转换成补码,将计算后的补码,再进行转换回去
int res1 = ~201; // 结果为:十进制 -202
int res2 = ~ -201; // 结果为:十进制 200
~ 00000000 00000000 00000000 11001001 201的补码
-------------------------------------------
11111111 11111111 11111111 00110110 补码
11111111 11111111 11111111 00110101 反码
10000000 00000000 00000000 11001010 原码
-202 负数
~ 11111111 11111111 11111111 00110111 -201的补码
-------------------------------------------
00000000 00000000 00000000 11001000 补码
00000000 00000000 00000000 11001000 反码
00000000 00000000 00000000 11001000 原码
200 正数
左移( << )
左移若干位,右边补0
每左移一位,相当于乘以2
int res1 = 10 << 2; // 结果为:十进制 40
int res2 = -10 << 2; // 结果为:十进制 -40
10 << 2
00000000 00000000 00000000 00001010 << 2
---------------------------------
00000000 00000000 00000000 00101000 正数40
负数:-10
10000000 00000000 00000000 00001010 原码
11111111 11111111 11111111 11110101 反码
11111111 11111111 11111111 11110110 补码
-10 << 2
11111111 11111111 11111111 11110110 << 2
---------------------------------
11111111 11111111 11111111 11011000 补码
11111111 11111111 11111111 11010111 反码
10000000 00000000 00000000 00101000 原码
-40 负数
带符号右移 ( >> )
右移若干位,正数左边补0,负数左边补1
int res1 = 10 >> 6; // 结果为:十进制 0
int res2 = -10 >> 6; // 结果为:十进制 -1
10 >> 6
00000000 00000000 00000000 00001010 >> 6
---------------------------------
00000000 00000000 00000000 00000000 正数0
十进制:-10
二进制原码: 10000000 00000000 00000000 00001010
二进制反码: 11111111 11111111 11111111 11110101
二进制补码: 11111111 11111111 11111111 11110110
-10 >> 6
11111111 11111111 11111111 11110110 >> 6
---------------------------------
11111111 11111111 11111111 11111111 补码
11111111 11111111 11111111 11111110 反码
10000000 00000000 00000000 00000001 原码
-1 负数
无符号右移( >>> )
右移若干位,无论正数或负数,左边都补0
int res1 = 10 >>> 6; // 结果为:十进制 0
int res2 = -10 >>> 6; // 结果为:十进制 67108863
10 >> 6
00000000 00000000 00000000 00001010 >> 6
---------------------------------
00000000 00000000 00000000 00000000 正数0
十进制:-10
二进制原码: 10000000 00000000 00000000 00001010
二进制反码: 11111111 11111111 11111111 11110101
二进制补码: 11111111 11111111 11111111 11110110
-10 >> 6
11111111 11111111 11111111 11110110 >> 6
---------------------------------
00000011 11111111 11111111 11111111 补码
00000011 11111111 11111111 11111111 反码
00000011 11111111 11111111 11111111 原码
67108863 正数
在线进制转换工具
进制转换工具:https://tool.oschina.net/hexconvert