【原码、反码、补码】
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
例如:
11
00000000 00000000 00000000 00001011(源码)
00000000 00000000 00000000 00001011(反码)
00000000 00000000 00000000 00001011(补码)
-11
10000000 00000000 00000000 00001011(源码)
11111111 11111111 11111111 11110100(反码)
11111111 11111111 11111111 11110101(补码)
【正数直接取二进制运算,负数取反加一得补码再运算】
【按位与&】符号位参与运算
两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0
4&5=4
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000101
-----------------------------------&
00000000 00000000 00000000 00000100
-4&5=4
11111111 11111111 11111111 11111100(补码)
00000000 00000000 00000000 00000101
-----------------------------------&
00000000 00000000 00000000 00000100
【按位或 |】符号位参与运算
有1为1,否则为0
4|5=5
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000101
-----------------------------------|
00000000 00000000 00000000 00000101
-4|5=-3
11111111 11111111 11111111 11111100(补码)
00000000 00000000 00000000 00000101
-----------------------------------|
11111111 11111111 11111111 11111101(补码)补码-1取反=源码
11111111 11111111 11111111 11111100(反码)
10000000 00000000 00000000 00000011(源码)= -3
【异或 ^】符号位参与运算
相同为0,不同为1
4^5=1
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000101
-----------------------------------^
00000000 00000000 00000000 00000001
-4^5=4
11111111 11111111 11111111 11111100(补码)
00000000 00000000 00000000 00000101
-----------------------------------^
11111111 11111111 11111111 11111001(补码)
11111111 11111111 11111111 11111000(fan码)
10000000 00000000 00000000 00000111(原码)= -7
【移位运算】
【左移 << (补码计算)】右边空出的位用0填补高位左移溢出则舍弃该高位
4<<2 = 16
00000000 00000000 00000000 00010000(正数原反补一样)= 16
-4<<2= -16
10000000 00000000 00000000 00000100(源码)
11111111 11111111 11111111 11111011(反码)
11111111 11111111 11111111 11111100(补码)= 反码+1
11111111 11111111 11111111 11110000(补码)<<2
11111111 11111111 11111111 11101111(反码)= 补码-1
10000000 00000000 00000000 00010000(源码)= -16
【右移 >> (补码计算)】左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;低位右移溢出则舍弃该位
4>>2 = 1
00000000 00000000 00000000 00000001(正数原反补一样)= 1
-4>>2 = -1
10000000 00000000 00000000 00000100(源码)
11111111 11111111 11111111 11111011(反码)
11111111 11111111 11111111 11111100(补码)= 反码+1
11111111 11111111 11111111 11111111(补码)>>2
11111111 11111111 11111111 11111110(反码)= 补码-1
10000000 00000000 00000000 00000001(源码)= -1
【无符右移>>>】
正数与右移规则一样,负数的无符号右移,就是相应的补码移位所得,在高位补0即可
4>>>2 = 1
00000000 00000000 00000000 00000001(正数原反补一样)= 1
-4>>>2 = 1073741823
10000000 00000000 00000000 00000100(源码)
11111111 11111111 11111111 11111011(反码)
11111111 11111111 11111111 11111100(补码)= 反码+1
00111111 11111111 11111111 11111111(补码)>>>2 = 1073741823 (不取反,直接输出)