计算机中,每一个数都是用补码来表示的(为了将减法变成加法,方便计算,原理的话以时钟为例:假设现在是1点,我想拨到3点,既可以顺时针拨2个跨度,也可以逆时针拨11个跨度,+2是不是和
-(12-2+1))的效果一样呢?
二进制的最高位为符号位,1代表负数,0代表正数,其余位表示数的绝对值
123转为二进制补齐后为:00000000 00000000 00000000 01111011,这是123的原码。
负数的原码按照绝对值转为二进制后,最高位补1。
-123的原码:10000000 00000000 00000000 01111011
反码:正数的反码和原码相同,负数的反码为原码除最高位外取反(0变1,1变0)。
补码:正数的反码和原码相同,负数的补码为原码除最高位外取反+1。
123的原码:00000000 00000000 00000000 01111011
123的反码:00000000 00000000 00000000 01111011
123的补码:00000000 00000000 00000000 01111011
-123的原码:10000000 00000000 00000000 01111011
-123的反码:11111111 11111111 11111111 10000100
-123的补码:11111111 11111111 11111111 10000101
已知补码求解码
最高位如果是1的话(负数),那么除了最高位之外的取反,然后加1得原码。
最高位如果是0的话,不变,正数的补码就是他的原码。
移位:
左移运算符<<
a<<n 将a的二进制数据左移b位,右边移空的部分补0
可以理解为数字a= a2^n(移了n位)。5<<2 -->52^2=20 -5<<2^2=-20
a>>n 将a的二进制数据右移b位,如果最高位是0,则左边移空的部分补0,如果最高位是1,则左边移空的部分补1
可以理解为数字a= a/2^n(移了n位),向下取整。5>>2 —> 5/2^2=1; -5>>2 --> -5/2^2=-2 (向下取整)
a>>>n 不管最高位是0或1,左边移空部分都补0
移位有什么用?
转自知乎
移位的奇淫技巧