关于二进制
关于二进制的概念,网上已经很多,这里不多赘述,只说关键的属性说明和示例。
记住,原码是给人看的,补码才是计算机真正使用的。
我们一般所说的二进制是有32位,首位是符号位。0是正数,1是负数。下面我们来根据例子说明二进制与十进制的转换,以及原码补码反码的概念。
二进制转10 进制(32位太长,我们省略我8位方便演示)
规则:从后往前依次下标为0,1,2..n,如果位是1 则记2的下标次方,有多少个是1的都相加。最后根据符号位标示正负即可。
- 示例1:0000 0011 的十进制是多少?
(2的0次方)+(2的1次方)= +3
- 示例2:1000 0011 的十进制是多少? 补码:1111 1101 -((2的0次方)+(2的1次方))= -3
对于正数来说,原码反码补码都一样。这里主要说的是负数。 以-3为例
- 原码
1000 0011
- 反码(原码0->1,1->0,保留符号位)
1111 1100
- 补码 =反码+1000 00111(逢2进1)
1111 1101
位运算(以补码进行计算)
a=-3,b=2;
位与 & (位同为1,记1,否则记0)
- 示例 a&b
a补码:1111 1101
b补码:0000 0010
结果: 0000 0000(正数补码反码一样) = 0
位或 | (位只要有1,则记1,否则记0)
- 示例a|b
a补码:1111 1101
b补码:0000 0010
结果: 1111 1111(补码)
结果反码:1111 1110
结果原码:1000 0001(保留符号位)
结果= -1
位异或 ^ (位不一样则记1,否则记0)
- 示例 a^b
a补码:1111 1101
b补码:0000 0010
结果: 1111 1111
结果反码:1111 1110(补码-1)
结果原码:1000 0001(保留符号位)
结果 = -1
位取反 ~ (位取反,1>0,0>1)
- 示例 ~a
a补码:1111 1101
结果: 0000 0010
结果 = 2
左移 << 符号位不变,低位补0 (自右向左低到高)
- 示例 a<<b
a补码:1111 1101
结果: 1111 0100
结果反码:1111 0011
结果原码:1000 1100(保留符号位)
结果 = -12
右移 >> 低位溢出,符号位不变,并用符号位补溢出的高位
- 示例 a>>b
a补码:1111 1101
结果: 1111 1111
结果反码:1111 1110
结果原码:1000 0001(保留符号位)
结果 = -1
备注
以上内容在java环境中测试通过。不对之处还望指正。
最后
作者:ricky
交流群: 244930845