C++ 提供了一组位操作运算符,可以对二进制数据进行位级别的操作。这些运算符操作二进制数的每一位,可以实现位移、与、或、异或等运算。下面详细介绍 C++ 中的二进制运算符及其用法。
位与运算符(&): 用于对两个操作数的每一位进行逻辑与操作。其规则是:如果两个相应的二进制位都为 1,则结果为 1,反之为 0。
位或运算符(|): 对两个操作数的每一位进行逻辑或操作。规则是:如果两个相应的二进制位中至少有一个 1,则结果为 1,否则为 0。
位异或运算符(^): 对两个操作数的每一位进行逻辑异或操作。规则是:如果两个相应的二进制位不相同,则结果为 1,否则为 0。
位取反运算符(~): 对操作数的每一位进行逻辑非操作,即按位取反。规则是:如果某个二进制位为 0,结果中该位为 1;如果某个二进制位为 1,结果中该位为 0。
位左移运算符(<<): 将操作数的每一位向左移动指定的位数。移出的位被丢弃,右侧用 0 填充。左移运算符用于实现二进制数的乘法。例如,将一个数左移 n 位相当于将该数乘以 2 的 n 次方。
位右移运算符(>>): 将操作数的每一位向右移动指定的位数。移出的位被丢弃,左侧用符号位填充(即对负数,用 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 表示负数)。
原码(Sign-Magnitude): 原码是二进制数最简单的表示形式。正数的原码与其二进制表示相同,负数的原码为其绝对值的二进制表示,最高位为符号位。例如,+5 的原码为 00000101,-5 的原码为 10000101。
反码(One’s Complement): 反码表示方法是在原码的基础上,对于负数取其原码的各个位按位取反。即正数的反码与其原码相同,负数的反码为对其原码按位取反。例如,+5 的反码为 00000101,-5 的反码为 11111010。
补码(Two’s Complement): 补码是计算机中最常用的表示有符号整数的方法。补码表示方法是在反码的基础上,对负数按位取反后再加 1。即正数的补码与其原码相同,负数的补码为对其反码按位取反后再加 1。例如,+5 的补码为 00000101,-5 的补码为 11111011。
为什么要使用补码表示负数呢?补码表示具有以下优势:
避免了原码和反码的加减运算中的符号处理问题。使用补码表示时,正数和负数的加减法可以统一使用相同的电路和算法进行计算。
补码只有一个零值,有效避免了正数和负数的相加减时出现两个零值的情况。
使用补码可以更方便地进行乘法和除法运算。
在计算机中,负数一般使用补码来表示,而正数使用原码或补码表示。补码在加法运算中具有天然的溢出性质,可以简化运算逻辑。
需要注意的是,在使用补码表示负数时,二进制数的位数是固定的。如果计算结果的补码超出了预定的位数范围,会发生溢出,丢失高位的信息。
总结来说,原码、反码和补码都是表示有符号整数的方法,补码表示是最常用和通用的方式,它对负数的表示和运算具有很多优势。