前言

在计算机世界中,整数的存储和运算方式与数学中的概念略有不同。为了高效处理正负数,计算机采用 原码、反码和补码 的方式表示整数。此外,位运算 作为底层优化的利器,广泛应用于程序开发、数据加密、图像处理等领域。本文将详细解析整数的表示方式,并深入剖析常见的位运算符。


一、整数的原码、反码和补码

计算机内部的整数存储方式通常基于二进制,在这之上,为了区分正负数,引入了 符号位(最高位,0 代表正数,1 代表负数)。在存储负数时,计算机采用了 原码、反码和补码 三种表示方式,其中补码是实际存储的格式。

1.1 原码(Sign-Magnitude)

原码的表示方式很直观,即:

  • 最高位 作为符号位(0 表示正数,1 表示负数)。
  • 其余位 直接表示数值的绝对值。

例如,在 8 位二进制系统中:

+5 的原码:00000101
-5 的原码:10000101

但这种表示方式存在问题:

  • 计算机中加法运算不够直观,比如 (+1) + (-1) ≠ 0(需要额外的处理)。
  • 存在 +0 和 -0 两种表示(00000000 和 10000000),造成存储浪费。

1.2 反码(One's Complement)

反码的规则:

  • 正数的反码 与原码相同。
  • 负数的反码,符号位保持不变,其他位按位取反(0 → 1,1 → 0)。

例如:

+5 的反码:00000101
-5 的反码:11111010

反码的优势:

  • 负数的表示更接近减法运算(即 -5 = 5 取反)。
  • 但仍然存在 +0 和 -0 的问题(00000000 和 11111111)。

1.3 补码(Two's Complement,实际存储方式)

补码是在反码的基础上 +1:

  • 正数的补码 与原码相同。
  • 负数的补码 = 反码 +1。

例如:

+5 的补码:00000101
-5 的补码:11111011  (反码 11111010 +1)

补码的优势:

  • 计算统一,无需额外处理负数运算((+1) + (-1) = 0)。
  • 只有一个 0,避免了 +0 和 -0 的问题。

总结:

数值原码反码补码(实际存储)
+5000001010000010100000101
-5100001011111101011111011
+0000000000000000000000000
-0100000001111111100000000

二、深入理解位运算

计算机的位运算是在二进制位上进行的运算,速度极快,常用于优化程序性能。

2.1 按位与(&)

规则:

  • 两个位都为 1,结果为 1,否则为 0。
  • 用于 清零、判断奇偶 等。

示例

int a = 5;  // 00000101
int b = 3;  // 00000011
int c = a & b;  // 00000001 (1)

应用:

  • 判断奇偶数:n & 1 == 0 则为偶数,否则为奇数。

2.2 按位或(|)

规则:

  • 只要有一个 1,结果就是 1。
  • 常用于 设置某些位。

示例

int a = 5;  // 00000101
int b = 3;  // 00000011
int c = a | b;  // 00000111 (7)

应用:

  • 将某一位设为 1,如 x | (1 << n) 将第 n 位设为 1。

2.3 按位异或(^)

规则:

  • 相同为 0,不同为 1。
  • 自反性:a ^ a = 0,a ^ 0 = a。
  • 交换律:a ^ b ^ a = b,可以用于 交换变量值。

示例

int a = 5;  // 00000101
int b = 3;  // 00000011
int c = a ^ b;  // 00000110 (6)

应用:

  • 交换两个变量(无临时变量):
a = a ^ b;
b = a ^ b;
a = a ^ b;

2.4 取反(~)

规则:

  • 0 变 1,1 变 0(所有位取反)。
  • 负数的补码表示方式,使 ~x = -x-1。

示例

int a = 5;  // 00000101
int b = ~a; // 11111010 (-6 的补码)

2.5 左移(<<)

规则:

  • 左移 n 位,相当于 ×2^n(左移填充 0)。

示例

int a = 5;  // 00000101
int b = a << 2; // 00010100 (20)

应用:

  • 快速乘法:x << 3 == x * 8

2.6 右移(>>)

规则:

  • 无符号数 右移补 0。
  • 有符号数 右移 补符号位(算术右移)。

示例

int a = -5;  // 11111011
int b = a >> 2; // 11111110 (-2)

应用:

  • 快速除法:x >> 3 == x / 8
  • 提取二进制某几位。

三、总结

  • 整数的存储 采用 补码,计算机计算更高效。
  • 位运算 直接对二进制位操作,速度快。
  • 常见应用:
    • & 取某些位
    • | 设某些位
    • ^ 交换变量
    • ~ 取反
    • << 乘法
    • >> 除法

理解 原码、反码、补码 以及 位运算,不仅能帮助我们优化代码,还能在底层开发中游刃有余。掌握这些知识,将使你在编程道路上更进一步! 🚀

最后插一句:

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=hpiyamye8bk

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐