深入理解整数的原码、反码、补码与位运算
·
前言
在计算机世界中,整数的存储和运算方式与数学中的概念略有不同。为了高效处理正负数,计算机采用 原码、反码和补码 的方式表示整数。此外,位运算 作为底层优化的利器,广泛应用于程序开发、数据加密、图像处理等领域。本文将详细解析整数的表示方式,并深入剖析常见的位运算符。
一、整数的原码、反码和补码
计算机内部的整数存储方式通常基于二进制,在这之上,为了区分正负数,引入了 符号位(最高位,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 的问题。
总结:
| 数值 | 原码 | 反码 | 补码(实际存储) |
|---|---|---|---|
| +5 | 00000101 | 00000101 | 00000101 |
| -5 | 10000101 | 11111010 | 11111011 |
| +0 | 00000000 | 00000000 | 00000000 |
| -0 | 10000000 | 11111111 | 00000000 |
二、深入理解位运算
计算机的位运算是在二进制位上进行的运算,速度极快,常用于优化程序性能。
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
更多推荐
所有评论(0)