C++位运算的19种高级技巧(建议收藏!)

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

  1. 位掩码:位掩码是一种用来提取二进制数中特定位的技巧。例如,如果我们想要提取一个整数的第3位,我们可以使用掩码0b00000100(二进制表示)与该整数进行按位与运算。代码示例:
int x = 5; // 0b00000101
int mask = 0b00000100;
int result = x & mask; // 0b00000100
  1. 按位异或:按位异或运算符^可以用来交换两个整数变量的值,而不需要使用第三个临时变量。代码示例:
int a = 5;
int b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 现在a的值为3,b的值为5
  1. 按位取反:按位取反运算符~可以用来快速计算一个整数的补码。例如,如果我们想要计算-5的补码,我们可以使用~4(因为-5的原码为1000…0101,其反码为0111…1010,补码为0111…1011,即4)。代码示例:
int x = -5;
int result = ~x + 1; // 4
  1. 左移和右移:左移运算符<<和右移运算符>>可以用来快速进行2的幂次方倍数的乘法和除法。例如,如果我们想要将一个整数乘以8(2的3次方),我们可以使用左移运算符将其左移3位。代码示例:
int x = 5;
int result = x << 3; // 40
  1. 判断奇偶性:我们可以使用按位与运算符&来快速判断一个整数是否为奇数。如果一个整数与1进行按位与运算后结果为1,则该整数为奇数;否则为偶数。代码示例:
int x = 5;
bool is_odd = x & 1; // true
  1. 清零特定位:我们可以使用按位与运算符&和按位取反运算符~来清零一个整数中特定的位。例如,如果我们想要清零一个整数的第3位,我们可以使用掩码0b11111011(即~0b00000100)与该整数进行按位与运算。代码示例:
int x = 5; // 0b00000101
int mask = 0b11111011;
int result = x & mask; // 0b00000001
  1. 设置特定位:我们可以使用按位或运算符|来设置一个整数中特定的位。例如,如果我们想要设置一个整数的第3位为1,我们可以使用掩码0b00000100与该整数进行按位或运算。代码示例:
int x = 1; // 0b00000001
int mask = 0b00000100;
int result = x | mask; // 0b00000101
  1. 切换特定位:我们可以使用按位异或运算符^来切换一个整数中特定的位。例如,如果我们想要切换一个整数的第3位,我们可以使用掩码0b00000100与该整数进行按位异或运算。代码示例:
int x = 5; // 0b00000101
int mask = 0b00000100;
int result = x ^ mask; // 0b00000001
  1. 判断符号:我们可以使用右移运算符>>来快速判断一个整数的符号。如果一个整数右移其位数减1位后结果为1,则该整数为负数;否则为正数。代码示例:
int x = -5;
bool is_negative = x >> (sizeof(int) * 8 - 1); // true
  1. 计算绝对值:我们可以使用按位异或运算符^和右移运算符>>来快速计算一个整数的绝对值。代码示例:
int x = -5;
int mask = x >> (sizeof(int) * 8 - 1);
int result = (x ^ mask) - mask; // 5
  1. 计算汉明重量:汉明重量是指一个二进制数中1的个数。我们可以使用按位与运算符&和右移运算符>>来快速计算一个整数的汉明重量。代码示例:
int x = 5; // 0b00000101
int count = 0;
while (x) {
    count += x & 1;
    x >>= 1;
}
// 现在count的值为2
  1. 计算汉明距离:汉明距离是指两个二进制数中不同位的个数。我们可以使用按位异或运算符^和按位与运算符&来快速计算两个整数的汉明距离。代码示例:
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
  1. 判断2的幂次方:我们可以使用按位与运算符&来快速判断一个整数是否为2的幂次方。如果一个整数与其减1后的结果进行按位与运算后结果为0,则该整数为2的幂次方;否则不是。代码示例:
int x = 8; // 0b00001000
bool is_power_of_two = !(x & (x - 1)); // true
  1. 计算最高有效位:我们可以使用右移运算符>>来快速计算一个整数的最高有效位(即最高位上的1)。代码示例:
int x = 10; // 0b00001010
int mask = ~0;
while (mask & x) {
    mask <<= 1;
}
mask >>= 1;
// 现在mask的值为0b00001000
  1. 计算最低有效位:我们可以使用按位与运算符&和按位取反运算符~来快速计算一个整数的最低有效位(即最低位上的1)。代码示例:
int x = 10; // 0b00001010
int result = x & -x; // 0b00000010
  1. 计算平均值:我们可以使用右移运算符>>来快速计算两个整数的平均值。代码示例:
int x = 5;
int y = 3;
int result = (x + y) >> 1; // 4
  1. 计算模数:我们可以使用按位与运算符&来快速计算一个整数对2的幂次方取模的结果。例如,如果我们想要计算一个整数对8(2的3次方)取模的结果,我们可以使用掩码0b00000111与该整数进行按位与运算。代码示例:
int x = 10;
int result = x & 0b00000111; // 2
  1. 判断符号相同:我们可以使用异或运算符^和右移运算符>>来快速判断两个整数是否符号相同。如果两个整数异或后右移其位数减1位后结果为0,则两个整数符号相同;否则不同。代码示例:
int x = 5;
int y = -3;
bool is_same_sign = !((x ^ y) >> (sizeof(int) * 8 - 1)); // false
  1. 计算最大值和最小值:我们可以使用按位异或运算符^和右移运算符>>来快速计算两个整数的最大值和最小值。代码示例:
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++位运算。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值