- C++
C++位运算的19种高级技巧
- 2025-7-22 13:43:01 @
C++位运算是一种高效的计算方法,它可以在不使用乘法和除法运算符的情况下进行快速计算。下面是19种高级技巧,帮助你更好地使用C++位运算。
位掩码:
位掩码是一种用来提取二进制数中特定位的技巧。例如,如果我们想要提取一个整数二进制的第3位,我们可以使用掩码(二进制表示)与该整数进行按位与运算。(也可以理解为对一个数按位与& 相当于我们对这个数取模) 代码示例:
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));