参考文章
前提
先认识下 32 位整数!
位31 表示符号位,0
为正数,1
位负数。
根据不同的数据类型占据的内存容量不同,可为 16
位(short
)、32
位(int
)、64
位(long
)等....,不过最高位始终表示符号位!!
二进制表示
十进制数转换为二进制数:整数部分除N取余数,小数部分乘N取整
原码、反码、补码
原码
- 正数:符号位 = 0,二进制
- 负数,符号位 = 1,二进制
范例:9
和 -9
9
为正数,符号位为 0
,二进制为 1001
,所以其原码为:0000 0000 0000 0000 0000 0000 0000 1001
-9
位负数,符号位为 1
,二进制表示为 1001
,所以其原码为:1000 0000 0000 0000 0000 0000 0000 1001
反码
- 正数的反码即原码
- 负数的反码,在其原码的基础上,符号位不变,数值位按位取反
范例:9
和 -9
9
为正数,反码即原码,为 0000 0000 0000 0000 0000 0000 0000 1001
;-9
为负数,符号位为 1
,数值位按位取反后为:1111 1111 1111 1111 1111 1111 1111 0110
补码
- 正数的补码:原码
- 负数的补码:反码 + 1
范例:9
和 -9
9
为正数,补码即原码,为 0000 0000 0000 0000 0000 0000 0000 1001
;-9
为负数,反码 + 1后得 1111 1111 1111 1111 1111 1111 1111 0111
负数的表示
据上述范例可知,负数以补码形式表达,分步骤得:
- 原码
- 反码
- 补码
原码、反码、补码总结
补码、反码需要先转换成原码后才能获取实际的二进制值,及进行其他进制的转换
二进制运算
加、减、乘、除、乘方等
逢2进1
按位与(&)
1 & 1 = 11 & 0 = 00 & 1 = 00 & 0 = 0
按位或(|)
1 | 1 = 11 | 0 = 10 | 1 = 10 | 0 = 0
按位异或(^)
1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0
按位取反(~)
~1 = 1 的反码
左移(<<)
左移位数不应该超过数值位的长度!例如:int
的数值位长度为 31,所以左移位数应 <= 31
!,如果超出,超出部分遵循:高位舍去,低位补0 原则,也不应该 < 0
!
9 << 5// 9在内存中的表示(补码):0000 0000 0000 0000 0000 0000 0000 1001<< 5,规则:高位舍去,低位补00000 0000 0000 0000 0000 0001 0010 0000换算成 10 进制就是:288
右移(>>)
细节上同左移。
9 >> 5// 9 在内存中的表示(补码)0000 0000 0000 0000 0000 0000 0000 1001>> 5,规则:高位补0或1,根据符号位确定,低位舍去0000 0000 0000 0000 0000 0000 0000 0000换算成 10 进制就是:0