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

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

前言

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

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

1.1 原码(Sign-Magnitude)原码的表示方式很直观,即:

最高位 作为符号位(0 表示正数,1 表示负数)。其余位 直接表示数值的绝对值。例如,在 8 位二进制系统中:

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

-5 的原码:10000101但这种表示方式存在问题:

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

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

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

-5 的反码:11111010反码的优势:

负数的表示更接近减法运算(即 -5 = 5 取反)。但仍然存在 +0 和 -0 的问题(00000000 和 11111111)。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 = 0,a ^ 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 * 82.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

相关数据

【苹果 6S 听筒 】苹果 6S 听筒 报价
365bet亚洲备用

【苹果 6S 听筒 】苹果 6S 听筒 报价

⌛ 08-29 👁️ 9774
巅峰战舰怎么充值便宜
be七365

巅峰战舰怎么充值便宜

⌛ 08-22 👁️ 1823