返回

Android修炼系列(十四):直击底层:探秘原码、反码、补码与位运算

Android

探索计算机底层:直击原码、反码、补码与位运算

在计算机世界的幕后,存在着一套复杂而迷人的底层机制,它决定着数字世界的运作方式。原码、反码、补码和位运算 就是这些机制中至关重要的元素,它们共同构成了计算机理解和处理有符号整数的方式。理解这些概念对于深入理解计算机系统和解锁其无限潜力至关重要。

原码:有符号整数的基础

原码是最基本的表示有符号整数的方法。对于正整数 ,原码直接采用其二进制表示。例如,十进制数 5 的原码为 0101。对于负整数 ,原码在其最高位(符号位)加上一个 1,其余位保持不变。十进制数 -5 的原码为 1101。符号位为 1 表示这是一个负数。

反码:从原码到补码的桥梁

反码是在原码的基础上,将除符号位以外的所有位取反得到。对于正整数,反码与原码相同。但对于负整数,反码将除符号位以外的所有位取反。例如,十进制数 -5 的原码为 1101,其反码为 0010。

补码:整数表示的终结者

补码是在反码的基础上,将最低位加 1 得到。对于正整数,补码与反码相同。但对于负整数,补码除符号位以外的所有位取反,并使最低位为 1。十进制数 -5 的反码为 0010,其补码为 0011。

位运算:二进制世界的魔法

位运算 是在二进制层面进行的运算,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)和左移(<<)、右移(>>)等运算。

  • 按位与运算 :将两个二进制数对应的位进行与运算,结果为 1 当且仅当两个位都为 1。例如,0101 & 1010 = 0000。
  • 按位或运算 :将两个二进制数对应的位进行或运算,结果为 0 当且仅当两个位都为 0。例如,0101 | 1010 = 1111。
  • 按位异或运算 :将两个二进制数对应的位进行异或运算,结果为 1 当且仅当两个位不同。例如,0101 ^ 1010 = 1110。
  • 按位取反运算 :将一个二进制数的每个位取反。例如,~0101 = 1010。
  • 左移运算 :将一个二进制数向左移动指定位数,空出的位补 0。例如,0101 << 2 = 101000。
  • 右移运算 :将一个二进制数向右移动指定位数,符号位不变,空出的位补 0 或 1(算术右移或逻辑右移)。例如,0101 >> 1 = 0010。

应用:底层机制的威力

原码、反码、补码和位运算在计算机系统中有广泛的应用:

  • 整数运算 :计算机使用补码表示有符号整数,进行加减乘除运算时,直接使用补码即可。
  • 数据存储 :计算机存储数据时,使用原码、反码或补码表示有符号整数,以节省存储空间。
  • 位操作 :位运算可以用来实现各种低级操作,例如:设置或清除标志位、提取字段等。

结论

原码、反码、补码和位运算 是计算机底层的基石,它们赋予了计算机处理有符号整数和执行各种二进制操作的能力。理解这些概念对于深入理解计算机系统和释放其全部潜力的至关重要。

常见问题解答

  1. 为什么计算机要使用补码而不是原码表示负整数?

答:因为补码可以方便地进行整数加减运算,而原码不能。

  1. 按位异或运算有什么用?

答:按位异或运算可以用来检查两个数字是否不同,或者用来设置或清除标志位。

  1. 左移和右移运算有什么区别?

答:左移运算相当于乘以 2 的幂,右移运算相当于除以 2 的幂。算术右移运算保留符号位,而逻辑右移运算补 0。

  1. 补码和反码有什么关系?

答:补码是在反码的基础上加 1 得到的,对于负整数,补码除符号位以外的所有位取反。

  1. 原码、反码、补码表示相同的数字吗?

答:对于正整数,原码、反码、补码表示相同的数字。对于负整数,原码、反码、补码表示不同的数字。