[算法与数据结构][Python/C++]:位运算(五分钟学会)- 附加常见的位运算应用以及Leetcode题库代码示例

Python/C++ 位运算按照数据在内存中的二进制位(Bit)进行操作,位运算符只能用来操作整数类型int,它按照整数在内存中的二进制形式进行计算。Python/C++ 支持的位运算符如表所示。

位运算符说明使用形式举 例
&按位与a & b4 & 5
|按位或a | b4 | 5
^按位异或a ^ b4 ^ 5
~按位取反~a~4
<<按位左移a << b4 << 2,表示整数 4 按位左移 2 位
>>按位右移a >> b4 >> 2,表示整数 4 按位右移 2 位

获取python中整数的二进制表示: bin()函数
获取C++中整数的二进制表示:bitset

#include <bitset>
int n = 5;
std::bitset<sizeof(int) * 8> binary(n);

1. 按位与&

  • 按位与运算符运算规则:0&0=0&1=1&0=0,1&1=1,即有0即0.

按位与在算法中的应用主要有:

  1. 判断整数的奇偶, 普遍的方法是取余操作,n%2==0 偶数,采用位运算可以提高程序的运行效率,n&1==1 奇数 n&1==0 偶数
int n = 4;
if ((n & 1) == 0) {
    cout << n << " is even." << endl;
} else {
    cout << n << " is odd." << endl;
}
  1. 消除特定位:使用按位与运算符(&)和按位取反运算符(~)可以将一个整数的特定位清零。例如,将整数 a 的第 3 位清零,可以使用表达式 a & ~(1 << 2)
int a = 12; // binary: 1100
a = a & ~(1 << 2);
cout << "a: " << a << endl; // binary: 1000
  1. 取指定位:使用按位与运算符(&)可以取出一个整数的指定位。例如,取出整数 a 的第 3 位,可以使用表达式 (a >> 2) & 1 或者a & (1 << 2) == (1 << 2)
  2. 判断一个整数是否为2的整数次方:如果一个整数是2的整数次方,那么它的二进制表示中只有一位是1,其他位都是0。因此,可以使用按位与运算符(&)判断一个整数是否为2的整数次方。例如,判断整数 n 是否为2的整数次方,可以使用表达式 (n & (n - 1)) == 0
  3. 求一个整数的二进制表示中1的个数:可以使用按位与运算符(&)求出一个整数的二进制表示中1的个数。例如,求整数 n 的二进制表示中1的个数,可以使用以下代码:
int n = 7; // binary: 111
int count = 0;
while (n) {
    n = n & (n - 1);
    count++;
}
cout << "The number of ones in the binary representation of n is: " << count << endl;
  1. 判断最低位的二进制为0 or 1.
  2. 位运算求最大公约数

相关代码题:
Leetcode:二进制中一的个数
Leetcode: 868 二进制间距

按位或 |

  • 按位或运算符的运算规则:0|1=1|0=1|1=1,0|0=0,有1即1
  1. 设置特定位:使用按位或运算符(|)可以将一个整数的特定位设置为 1。例如,将整数 a 的第 3 位设置为 1,可以使用表达式 a | (1 << 2)
int a = 4; // binary: 100
a = a | (1 << 2);
cout << "a: " << a << endl; // binary: 1100
  1. 合并掩码:使用按位或运算符(|)可以将多个掩码合并为一个掩码。例如,假设有两个掩码 mask1 和 mask2,可以使用表达式 mask1 | mask2 将它们合并为一个掩码。
    相关代码题:

按位异或^

  • 位异或运算符运算规则:0 ^ 0=1 ^ 1=0,0 ^ 1=1 ^ 0=1

异或运算:相同元素异或为0

  1. 交换两个值:使用按位异或运算符(^)可以在不使用临时变量的情况下交换两个值。例如,交换整数 a 和 b 的值,可以使用以下代码:
int a = 3, b = 4;
a = a ^ b;
b = b ^ a;
a = a ^ b;
cout << "a: " << a << ", b: " << b << endl;
  1. 翻转特定位:使用按位异或运算符(^)可以翻转一个整数的特定位。例如,翻转整数 a 的第 3 位,可以使用表达式 a ^ (1 << 2)。
int a = 12; // binary: 1100
a = a ^ (1 << 2);
cout << "a: " << a << endl; // binary: 1000
  1. 快速判断两个值是否相等:可以使用按位异或运算符(^)快速判断两个值是否相等。例如,判断整数 a 和 b 是否相等,可以使用表达式 (a ^ b) == 0。
int a = 3, b = 4;
if ((a ^ b) == 0) {
    cout << a << " and " << b << " are equal." << endl;
} else {
    cout << a << " and " << b << " are not equal." << endl;
}

相关代码题:
找出成对元素中单个出现的元素

按位取反 ~

  • 位求反运算符运算规则:~ 0=1,~ 1=0,对于整数x有**~x=-(x+1)**

相关代码:

左移位运算符 << ,<<=

  • 左移位运算符运算规则:原来的所有位左移,最低位补0,移多少位相当于乘以2的多少次方。

对于左移 << 、右移 >>:对原始值不做改变,只返回位移操作之后的值;
对于左移 <<= 、右移 >>=:会修改原始值,不返回任何值(或者说,返回 None )。

右移位运算符>>, >>=

  • 右移位运算符运算规则:原来的所有位右移,最低位丢弃,最高位使用符号位填充,相当于整除2 的移位次方

相关代码题:
Leetcode: 868 二进制间距

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值