由于计算机运行时是按照补码的方式来运算的,所以在运算前我们应该找出对应的补码,然后再进行运算
1、二进制中的原码、反码、补码
(1)对于有符号而言:
1)二进制中的最高位是符号位:0表示正数,1表示负数
2)正数的原码、反码、补码都一样(三码合一)
3)负数的反码=它的原码符号位不变,其他位取反
4)负数的补码=它的反码加1,那么,负数的反码就等于它的补码减1
5)0的反码是0
6)在计算机运行的时候,都是以补码的形式来运行的
2、习题
(1)int a = 1 >> 2
1的原码、反码、补码都是00000000 00000000 00000000 00000001
右移是左边舍弃,右边补0:00000000 00000000 00000000 00000000
(2)int b = -1 >> 2
-1的原码是:100000000 00000000 00000000 00000001
反码是:11111111 11111111 11111111 11111110
补码是:11111111 11111111 11111111 11111111
-1补码右移两位之后:11111111 11111111 11111111 11111111
-1右移之后的反码:11111111 11111111 11111111 11111110
-1右移之后的原码:100000000 00000000 00000000 00000001
(3)int c = 1 << 2
00000000 00000000 00000000 00000100
(4)int d = -1 << 2
-1原码:100000000 00000000 00000000 00000001
-1反码:11111111 11111111 11111111 11111110
-1补码:11111111 11111111 11111111 11111111
-1 << 2:11111111 11111111 11111111 11111100
-1左移之后的反码:11111111 11111111 11111111 11111011
-1左移之后的原码:10000000 00000000 00000000 00000100
(5)~2=-3
正数三码合一,2的补码就是:00000000 00000000 00000000 00000010
取反:11111111 11111111 11111111 111111101
取反之后是负数,看不懂啊,怎么办?这个取反的结果依旧是个补码,还原就好了,既然负数的补码是它的反码加1,那么它的反码就等于补码减1。负数取反的时候符号不变,那么负数还原的时候,符号也不变
反码:11111111 11111111 11111111 11111100
原码:10000000 00000000 00000000 00000011
(6)2&3=2
2的二进制:00000000 00000000 00000000 00000010
3的二进制:00000000 00000000 00000000 00000011
按位与的时候,同真为真。上面每一位按位与出来的结果如下:
00000000 00000000 00000000 00000010(二进制)=2(十进制)
(7)2|3=3
运算结果为:00000000 00000000 00000000 00000011(二进制)=3(十进制)
按位或的时候,有真为真,无真为假。
(8)~-5=4
-5原码:10000000 00000000 00000000 00000101
-5反码:11111111 11111111 11111111 11111010
-5补码:11111111 11111111 11111111 11111011
-5取反:00000000 00000000 00000000 00000100(二进制)=4(十进制)
(9)-3^3=-2
-3原码:10000000 00000000 00000000 00000011
反码:11111111 11111111 11111111 11111100
补码:11111111 11111111 11111111 11111101
3补码:00000000 00000000 00000000 00000011
异或的规则就是不同为真,相同为假。
-3^3=11111111 11111111 11111111 11111110
上面的异或结果为补码异或
反码:11111111 11111111 11111111 11111101
原码:10000000 00000000 00000000 00000010(二进制)=-2(十进制)