原码反码补码
在其之前我们要先了解计算机里面的三种机械数
计算机都是通过数字的补码进行运算
- 原码
原码是人类的正常理解方式的二进制,即首位表示的是正负号,其余位表示的是数值。
- 反码
负数的反码是除了符号位不变其余的0变1,1变0,正数的反码还是它本身 - 补码
负数的补码是除了符号位不变其余的0变1,1变0,最后在再1,正数的反码还是它本身
<< (左移):x<<y==x*(2^y)
左移就是将二进制的每一个数都往左移动一位,高位舍去,低位补0
栗子:
- 1<<1
原码:000000001
第一步:反码:00000001
第二步:补码:00000001
第三步:移动:00000010
第四步:反码:00000010
第五步:原码:00000010
也就是1*(2^1)=2
- -3<<2
原码:10000011
第一步:反码:11111100
第二步:补码:11111101
第三步:移动:11110100
第四步:反码:11110011
第五步:原码:10001100
(因为负数的补码是最后+1,所以再往原码转化的时候应该-1)
也就是-3*(2^2)=-12
<< (右移):x>>y==x/(2^y)
右移就是将二进制的每一个数都往右移动一位,高位补1,低位舍去
栗子:
- 15>>2
原码:00001111
第一步:反码:00001111
第二步:补码:00001111
第三步:移动:00000011
第四步:反码:00000011
第五步:原码:00000011
也就是15/(2^2)=3
- -4>>2
原码:10000100
第一步:反码:11111011
第二步:补码:11111100
第三步:移动:11111111
第四步:反码:11111110
第五步:原码:10000001
(因为负数的补码是最后+1,所以再往原码转化的时候应该-1)
也就是-4/(2^2)=-1
后记
这个知识其实之前我并不是很了解,之前只是知道这有什么作用,但是并没有弄懂他为什么是这样运算的,但是今天被一个好朋友问起来,当时我只是把怎么用给她说了说,但是并不知道她那书上和我理解了恰恰相反。。所以就去网上查阅了相关资料,才致使没有翻车。。