C++位运算是一种高效的计算方法,它可以在不使用乘法和除法运算符的情况下进行快速计算。下面是19种高级技巧,帮助你更好地使用C++位运算。
- 位掩码:位掩码是一种用来提取二进制数中特定位的技巧。例如,如果我们想要提取一个整数的第3位,我们可以使用掩码
0b00000100
(二进制表示)与该整数进行按位与运算。代码示例:
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));
// 现在max_value的值为5,min_value的值为3
以上就是C++位运算的19种高级技巧,希望能够帮助你更好地使用C++位运算。