c++的二进制运算和位运算(二进制原码补码反码)

C++ 提供了一组位操作运算符,可以对二进制数据进行位级别的操作。这些运算符操作二进制数的每一位,可以实现位移、与、或、异或等运算。下面详细介绍 C++ 中的二进制运算符及其用法。

  1. 位与运算符(&): 用于对两个操作数的每一位进行逻辑与操作。其规则是:如果两个相应的二进制位都为 1,则结果为 1,反之为 0。

  2. 位或运算符(|): 对两个操作数的每一位进行逻辑或操作。规则是:如果两个相应的二进制位中至少有一个 1,则结果为 1,否则为 0。

  3. 位异或运算符(^): 对两个操作数的每一位进行逻辑异或操作。规则是:如果两个相应的二进制位不相同,则结果为 1,否则为 0。

  4. 位取反运算符(~): 对操作数的每一位进行逻辑非操作,即按位取反。规则是:如果某个二进制位为 0,结果中该位为 1;如果某个二进制位为 1,结果中该位为 0。

  5. 位左移运算符(<<): 将操作数的每一位向左移动指定的位数。移出的位被丢弃,右侧用 0 填充。左移运算符用于实现二进制数的乘法。例如,将一个数左移 n 位相当于将该数乘以 2 的 n 次方。

  6. 位右移运算符(>>): 将操作数的每一位向右移动指定的位数。移出的位被丢弃,左侧用符号位填充(即对负数,用 1 填充;对正数,用 0 填充)。右移运算符用于实现二进制数的除法。例如,将一个有符号数右移 n 位相当于将该数除以 2 的 n 次方。

这些位操作运算符主要用于处理底层数据,例如对字节、位标志进行操作,以及在一些特殊场景下的性能优化。在使用这些运算符时,需要格外小心避免位运算的陷阱和副作用。

以下是一些示例代码,演示这些位操作运算符的用法:

#include <iostream>

int main() {
    int a = 5;  // 二进制表示为 00000101
    int b = 3;  // 二进制表示为 00000011

    int c = a & b;  // 与运算,结果为 00000001,即 1
    int d = a | b;  // 或运算,结果为 00000111,即 7
    int e = a ^ b;  // 异或运算,结果为 00000110,即 6
    int f = ~a;     // 取反运算,结果为 11111010,即 -6

    std::cout << c << std::endl;
    std::cout << d << std::endl;
    std::cout << e << std::endl;
    std::cout << f << std::endl;

    int x = 1;  // 二进制表示为 00000001

    int y = x << 3;  // 左移 3 位,结果为 00001000,即 8
    int z = x >> 2;  // 右移 2 位,结果为 00000000,即 0

    std::cout << y << std::endl;
    std::cout << z << std::endl;

    return 0;
}

上述代码展示了位与、位或、位异或、位取反、位左移和位右移运算符的用法。在实际运用中,要根据具体需求灵活运用这些运算符,同时要注意处理溢出和符号扩展等问题。 

二进制原码补码反码:

在计算机中,二进制数可以表示为原码、反码和补码。这些表示方法常用于表示有符号整数,其中最高位表示符号位(0 表示正数,1 表示负数)。

  1. 原码(Sign-Magnitude): 原码是二进制数最简单的表示形式。正数的原码与其二进制表示相同,负数的原码为其绝对值的二进制表示,最高位为符号位。例如,+5 的原码为 00000101,-5 的原码为 10000101。

  2. 反码(One’s Complement): 反码表示方法是在原码的基础上,对于负数取其原码的各个位按位取反。即正数的反码与其原码相同,负数的反码为对其原码按位取反。例如,+5 的反码为 00000101,-5 的反码为 11111010。

  3. 补码(Two’s Complement): 补码是计算机中最常用的表示有符号整数的方法。补码表示方法是在反码的基础上,对负数按位取反后再加 1。即正数的补码与其原码相同,负数的补码为对其反码按位取反后再加 1。例如,+5 的补码为 00000101,-5 的补码为 11111011。

为什么要使用补码表示负数呢?补码表示具有以下优势:

  1. 避免了原码和反码的加减运算中的符号处理问题。使用补码表示时,正数和负数的加减法可以统一使用相同的电路和算法进行计算。

  2. 补码只有一个零值,有效避免了正数和负数的相加减时出现两个零值的情况。

  3. 使用补码可以更方便地进行乘法和除法运算。

在计算机中,负数一般使用补码来表示,而正数使用原码或补码表示。补码在加法运算中具有天然的溢出性质,可以简化运算逻辑。

需要注意的是,在使用补码表示负数时,二进制数的位数是固定的。如果计算结果的补码超出了预定的位数范围,会发生溢出,丢失高位的信息。

总结来说,原码、反码和补码都是表示有符号整数的方法,补码表示是最常用和通用的方式,它对负数的表示和运算具有很多优势。

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捉只树袋熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值