C++教程之位运算

背景

C++ 中的位运算是一种对二进制位进行操作的运算。C++ 支持多种位运算操作符,包括按位与、按位或、按位异或、左移和右移等。本文将介绍 C++ 中的位运算操作符及其用法。

按位与(&)

按位与操作符(&)用于对两个二进制数的每一位进行与运算。如果两个二进制数的对应位都为 1,则结果的对应位为 1,否则为 0。例如:

unsigned int a = 0b1010; // 10
unsigned int b = 0b1100; // 12
unsigned int c = a & b;  // 0b1000, or 8 in decimal

在这个例子中,变量 a 和 b 分别表示二进制数 1010 和 1100,按位与操作的结果为二进制数 1000,或者十进制数 8。

在 C++ 中,按位与操作符(&)可以用于多种应用场景,例如:

清除二进制数的某些位:可以使用按位与操作符将二进制数的某些位清零。例如,要将二进制数 10101110 的低 4 位清零,可以使用以下代码:

unsigned char a = 0xAE; // 10101110
unsigned char b = 0xF0; // 11110000
unsigned char c = a & b; // 10100000

在这个例子中,变量 a 表示二进制数 10101110,变量 b 表示二进制数 11110000,按位与操作的结果为二进制数 10100000,或者十六进制数 0xA0。

判断二进制数的某些位是否为 1:可以使用按位与操作符判断二进制数的某些位是否为 1。例如,要判断二进制数 10101110 的第 3 位是否为 1,可以使用以下代码:

unsigned char a = 0xAE; // 10101110
unsigned char b = 0x08; // 00001000
bool c = (a & b) != 0;  // true

在这个例子中,变量 a 表示二进制数 10101110,变量 b 表示二进制数 00001000,按位与操作的结果为二进制数 00001000,或者十六进制数 0x08。由于结果不为 0,所以第 3 位为 1。

按位或(|)

按位或操作符(|)用于对两个二进制数的每一位进行或运算。如果两个二进制数的对应位都为 0,则结果的对应位为 0,否则为 1。例如:

unsigned int a = 0b1010; // 10
unsigned int b = 0b1100; // 12
unsigned int c = a | b;  // 0b1110, or 14 in decimal

在 C++ 中,按位或操作符(|)可以用于多种应用场景。
设置二进制数的某些位:可以使用按位或操作符将二进制数的某些位设置为 1。例如,要将二进制数 10100000 的低 4 位设置为 1,可以使用以下代码:

unsigned char a = 0xA0; // 10100000
unsigned char b = 0x0F; // 00001111
unsigned char c = a | b; // 10101111

在这个例子中,变量 a 表示二进制数 10100000,变量 b 表示二进制数 00001111,按位或操作的结果为二进制数 10101111,或者十六进制数 0xAF。

合并两个二进制数的某些位:可以使用按位或操作符合并两个二进制数的某些位。例如,要将二进制数 10100000 的低 4 位替换为二进制数 00001111 的低 4 位,可以使用以下代码:

unsigned char a = 0xA0; // 10100000
unsigned char b = 0x0F; // 00001111
unsigned char c = (a & 0xF0) | (b & 0x0F); // 10101111

在这个例子中,变量 a 表示二进制数 10100000,变量 b 表示二进制数 00001111,我们使用按位与操作符 & 将 a 的高 4 位和 b 的低 4 位分别取出,然后使用按位或操作符 | 将它们合并起来,得到二进制数 10101111,或者十六进制数 0xAF。

按位异或(^)

按位异或操作符(^)用于对两个二进制数的每一位进行异或运算。如果两个二进制数的对应位相同,则结果的对应位为 0,否则为 1。例如:

unsigned int a = 0b1010; // 10
unsigned int b = 0b1100; // 12
unsigned int c = a ^ b;  // 0b0110, or 6 in decimal

在这个例子中,变量 a 和 b 分别表示二进制数 1010 和 1100,按位异或操作的结果为二进制数 0110,或者十进制数 6。

在 C++ 中,按位异或操作符(^)可以用于多种应用场景,例如:
加密和解密:可以使用按位异或操作符对数据进行简单的加密和解密。例如,要将字符串 hello 加密,可以使用以下代码:

std::string str = "hello";
char key = 'a';
for (int i = 0; i < str.length(); i++) {
    str[i] ^= key;
}

在这个例子中,我们使用按位异或操作符 ^ 将字符串 hello 中的每个字符与密钥 a 进行异或运算,从而对字符串进行加密。要解密字符串,只需要再次对加密后的字符串进行异或运算即可。

交换两个变量的值:可以使用按位与操作符交换两个变量的值。例如,要交换变量 a 和 b 的值,可以使用以下代码:

unsigned int a = 123;
unsigned int b = 456;
a ^= b;
b ^= a;
a ^= b;

在这个示例中,我们使用按位异或操作符 ^ 来交换变量 a 和 b 的值。首先,我们将 a 与 b 异或,将结果存储在 a 中。然后,我们将 b 与 a 异或,将结果存储在 b 中。最后,我们将 a 与 b 异或,将结果存储在 a 中。这样,变量 a 和 b 的值就被成功交换了。

左移(<<)

左移操作符(<<)用于将一个二进制数向左移动指定的位数。左移操作会在二进制数的右侧添加指定数量的 0。例如:

unsigned int a = 0b1010; // 10
unsigned int b = a << 2; // 0b101000, or 40 in decimal

在这个例子中,变量 a 表示二进制数 1010,左移 2 位后得到二进制数 101000,或者十进制数 40。

右移(>>)

右移操作符(>>)用于将一个二进制数向右移动指定的位数。右移操作会在二进制数的左侧添加指定数量的 0 或 1,取决于二进制数的符号位。例如:

unsigned int a = 0b1010; // 10
unsigned int b = a >> 2; // 0b10, or 2 in decimal

在 C++ 中,左移和右移操作符(<< 和 >>)可以用于多种应用场景,例如:

乘法和除法:可以使用左移和右移操作符进行乘法和除法运算。例如,要将整数 123 向左移动 3 位,相当于将 123 乘以 2 的 3 次方,即 123 * 8 = 984。同样地,将整数 984 向右移动 3 位,相当于将 984 除以 2 的 3 次方,即 984 / 8 = 123。可以使用以下代码进行乘法和除法运算:
在这个例子中,变量 a 表示二进制数 1010,右移 2 位后得到二进制数 10,或者十进制数 2。

int a = 123;
int b = a << 3; // 984
int c = b >> 3; // 123

最后

这篇文章主要讲述来C++中的位运算,更多文章可以关注公众号QStack。

猜你喜欢

转载自blog.csdn.net/QStack/article/details/129720601