二进制与十进制概览
探索二进制与十进制的关系
位运算简述
在程序设计中,位操作指的是对二进制数执行一系列位模式的一元和二元运算。
>> 表示有符号的右移操作。简言之,它在对数字进行移动时考虑了数字的正负性。
>>> 表示无符号的右移操作。换言之,它在进行运算时不会区分数字的正负。
十进制的二进制形式为 10 时,其二进制表示是 1010。
计算 10 的有符号右移一位:
10 的二进制是 1010,向右移动一位(有符号),即为 101。由于这是正数,补全32位时,前导零会被补充,故十进制表示为 5。
正数与负数在计算机中的表示
正数在二进制中易于表达,而负数则以补码的形式在计算机中表示。
-10 的补码表示
二进制表示 -10 时为 000...000(28个0)1010(原码)。
反码表示则是 111...111(28个1)0101。
补码则是通过取反加一得到的 111...111(28个1)0110。
执行有符号位移操作
右移一位后,由于是最左位的数字是1(代表负数),补全32位后的数字前面部分仍为 1,然后去掉原本的最低位的零,即 1 变为 0,补上新的一位 0,最终结果为 111...111(29个1)01。
恢复原码的步骤
由于补码的符号位为“1”,则此数为负数。要得到其原码,需要取反再加一。得到结果为 100...0(28个0)的数值位取反后加一,即 100...(28个0) + 1 = 5。
-5 的计算过程
将负数 -5 的二进制表示为 5 的二进制形式(正数),然后加上原先的符号位(这里是负号),因此是 -5。
执行无符号位移操作
- 减去移去的零,左边补上一个零(无视正负),即为 29位的结果:加上补足的零(一个数字扩展至完整的32位),得到新的数值。对于无符号数而言,直接将数值部分进行位移即可。
- 对于数字 -5 的无符号位移,它的数值表示仍为负数的32位扩展,但其具体的值已如前述算得为正数的值,即无符号位移后其十进制表示为 2^32 - 5。