首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >深入理解整数的原码、反码、补码与位运算

深入理解整数的原码、反码、补码与位运算

作者头像
禁默
发布2025-12-24 15:37:53
发布2025-12-24 15:37:53
40
举报

前言

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


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

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

1.1 原码(Sign-Magnitude)

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

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

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

代码语言:javascript
复制
+5 的原码:00000101
-5 的原码:10000101

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

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

反码的规则:

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

例如:

代码语言:javascript
复制
+5 的反码:00000101
-5 的反码:11111010

反码的优势:

  • 负数的表示更接近减法运算(即 -5 = 5 取反)。
  • 但仍然存在 +0 和 -0 的问题0000000011111111)。
1.3 补码(Two's Complement,实际存储方式)

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

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

例如:

代码语言:javascript
复制
+5 的补码:00000101
-5 的补码:11111011  (反码 11111010 +1)

补码的优势:

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

总结:

数值

原码

反码

补码(实际存储)

+5

00000101

00000101

00000101

-5

10000101

11111010

11111011

+0

00000000

00000000

00000000

-0

10000000

11111111

00000000


二、深入理解位运算

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

2.1 按位与(&)

规则

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

示例

代码语言:javascript
复制
int a = 5;  // 00000101
int b = 3;  // 00000011
int c = a & b;  // 00000001 (1)

应用

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

2.2 按位或(|)

规则

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

示例

代码语言:javascript
复制
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 = 0a ^ 0 = a
  • 交换律a ^ b ^ a = b,可以用于 交换变量值

示例

代码语言:javascript
复制
int a = 5;  // 00000101
int b = 3;  // 00000011
int c = a ^ b;  // 00000110 (6)

应用

  • 交换两个变量(无临时变量):
代码语言:javascript
复制
a = a ^ b;
b = a ^ b;
a = a ^ b;

2.4 取反(~)

规则

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

示例

代码语言:javascript
复制
int a = 5;  // 00000101
int b = ~a; // 11111010 (-6 的补码)

2.5 左移(<<)

规则

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

示例

代码语言:javascript
复制
int a = 5;  // 00000101
int b = a << 2; // 00010100 (20)

应用

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

2.6 右移(>>)

规则

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

示例

代码语言:javascript
复制
int a = -5;  // 11111011
int b = a >> 2; // 11111110 (-2)

应用

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

三、总结

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

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

最后插一句:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 一、整数的原码、反码和补码
      • 1.1 原码(Sign-Magnitude)
      • 1.2 反码(One's Complement)
      • 1.3 补码(Two's Complement,实际存储方式)
    • 二、深入理解位运算
      • 2.1 按位与(&)
      • 2.2 按位或(|)
      • 2.3 按位异或(^)
      • 2.4 取反(~)
      • 2.5 左移(<<)
      • 2.6 右移(>>)
    • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档