• C++
  • C++位运算的19种高级技巧

  • @ 2025-7-22 13:43:01

C++位运算是一种高效的计算方法,它可以在不使用乘法和除法运算符的情况下进行快速计算。下面是19种高级技巧,帮助你更好地使用C++位运算。

位掩码:

位掩码是一种用来提取二进制数中特定位的技巧。例如,如果我们想要提取一个整数二进制的第3位,我们可以使用掩码0b000001000b00000100(二进制表示)与该整数进行按位与运算。(也可以理解为对一个数按位与& 相当于我们对这个数取模) 代码示例:

int x = 5; // 0b00000101
int mask = 0b00000100;
int result = x & mask; // 0b00000100

按位异或:

按位异或运算符^可以用来交换两个整数变量的值,而不需要使用第三个临时变量。 代码示例:

int a = 5;
int b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 现在a的值为3,b的值为5

按位取反:

按位取反运算符 ~ 可以用来快速计算一个整数的补码。例如,如果我们想要计算-5的补码,我们可以使用~4(因为-5的原码为1000…0101,其反码为0111…1010,补码为0111…1011,即4)。 代码示例:

int x = -5;
int result = ~x + 1; // 4

左移和右移:

左移运算符<<和右移运算符>>可以用来快速进行2的幂次方倍数的乘法和除法。例如,如果我们想要将一个整数乘以8(2的3次方),我们可以使用左移运算符将其左移3位。 代码示例:

int x = 5;
int result = x << 3; // 40

判断奇偶性:

我们可以使用按位与运算符&来快速判断一个整数是否为奇数。如果一个整数与1进行按位与运算后结果为1,则该整数为奇数;否则为偶数。 代码示例:

int x = 5;
bool is_odd = x & 1; // true

清零特定位:

我们可以使用按位与运算符&和按位取反运算符 ~ 来清零一个整数中特定的位。例如,如果我们想要清零一个整数的第3位,我们可以使用掩码0b11111011(即~0b00000100)与该整数进行按位与运算。 代码示例:

int x = 5; // 0b00000101
int mask = 0b11111011;
int result = x & mask; // 0b00000001

设置特定位:

我们可以使用按位或运算符|来设置一个整数中特定的位。例如,如果我们想要设置一个整数的第3位为1,我们可以使用掩码0b00000100与该整数进行按位或运算。 代码示例:

int x = 1; // 0b00000001
int mask = 0b00000100;
int result = x | mask; // 0b00000101

切换特定位:

我们可以使用按位异或运算符^来切换一个整数中特定的位。例如,如果我们想要切换一个整数的第3位,我们可以使用掩码0b00000100与该整数进行按位异或运算。 代码示例:

int x = 5; // 0b00000101
int mask = 0b00000100;
int result = x ^ mask; // 0b00000001

判断符号:

我们可以使用右移运算符>>来快速判断一个整数的符号。如果一个整数右移其位数减1位后结果为1,则该整数为负数;否则为正数。 代码示例:

int x = -5;
bool is_negative = x >> (sizeof(int) * 8 - 1); // true

计算绝对值:

我们可以使用按位异或运算符^和右移运算符>>来快速计算一个整数的绝对值。 代码示例:

int x = -5;
int mask = x >> (sizeof(int) * 8 - 1);
int result = (x ^ mask) - mask; // 5

计算汉明重量:

汉明重量是指一个二进制数中1的个数。我们可以使用按位与运算符&和右移运算符>>来快速计算一个整数的汉明重量。 代码示例:

int x = 5; // 0b00000101
int count = 0;
while (x) {
    count += x & 1;
    x >>= 1;
}
// 现在count的值为2

计算汉明距离:

汉明距离是指两个二进制数中不同位的个数。我们可以使用按位异或运算符^和按位与运算符&来快速计算两个整数的汉明距离。 代码示例:

int x = 5; // 0b00000101
int y = 3; // 0b00000011
int z = x ^ y; // 0b00000110
int count = 0;
while (z) {
    count += z & 1;
    z >>= 1;
}
// 现在count的值为2

判断2的幂次方:

我们可以使用按位与运算符&来快速判断一个整数是否为2的幂次方。如果一个整数与其减1后的结果进行按位与运算后结果为0,则该整数为2的幂次方;否则不是。 代码示例:

int x = 8; // 0b00001000
bool is_power_of_two = !(x & (x - 1)); // true

计算最高有效位:

我们可以使用右移运算符>>来快速计算一个整数的最高有效位(即最高位上的1)。代码示例:

int x = 10; // 0b00001010
int mask = ~0;
while (mask & x) {
    mask <<= 1;
}
mask >>= 1;
// 现在mask的值为0b00001000

计算最低有效位:

我们可以使用按位与运算符&和按位取反运算符~来快速计算一个整数的最低有效位(即最低位上的1)。 代码示例:

int x = 10; // 0b00001010
int result = x & -x; // 0b00000010

计算平均值:

我们可以使用右移运算符>>来快速计算两个整数的平均值。 代码示例:

int x = 5;
int y = 3;
int result = (x + y) >> 1; // 4

计算模数:

我们可以使用按位与运算符&来快速计算一个整数对2的幂次方取模的结果。例如,如果我们想要计算一个整数对8(2的3次方)取模的结果,我们可以使用掩码0b00000111与该整数进行按位与运算。 代码示例:

int x = 10;
int result = x & 0b00000111; // 2

判断符号相同:

我们可以使用异或运算符^和右移运算符>>来快速判断两个整数是否符号相同。如果两个整数异或后右移其位数减1位后结果为0,则两个整数符号相同;否则不同。 代码示例:

int x = 5;
int y = -3;
bool is_same_sign = !((x ^ y) >> (sizeof(int) * 8 - 1)); // false

计算最大值和最小值:

我们可以使用按位异或运算符^和右移运算符>>来快速计算两个整数的最大值和最小值。 代码示例:

int x = 5;
int y = 3;
int max_value = y ^ ((x ^ y) & -(x < y));
int min_value = x ^ ((x ^ y) & -(x < y));

以上就是C++位运算的19种高级技巧,希望能够帮助你更好地使用C++位运算。

0 条评论

目前还没有评论...