Python/C++ 位运算按照数据在内存中的二进制位(Bit)进行操作,位运算符只能用来操作整数类型int,它按照整数在内存中的二进制形式进行计算。Python/C++ 支持的位运算符如表所示。
位运算符 | 说明 | 使用形式 | 举 例 |
---|---|---|---|
& | 按位与 | a & b | 4 & 5 |
| | 按位或 | a | b | 4 | 5 |
^ | 按位异或 | a ^ b | 4 ^ 5 |
~ | 按位取反 | ~a | ~4 |
<< | 按位左移 | a << b | 4 << 2,表示整数 4 按位左移 2 位 |
>> | 按位右移 | a >> b | 4 >> 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.
按位与在算法中的应用主要有:
- 判断整数的奇偶, 普遍的方法是取余操作,
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;
}
- 消除特定位:使用按位与运算符(&)和按位取反运算符(~)可以将一个整数的特定位清零。例如,将整数 a 的第 3 位清零,可以使用表达式
a & ~(1 << 2)
。
int a = 12; // binary: 1100
a = a & ~(1 << 2);
cout << "a: " << a << endl; // binary: 1000
- 取指定位:使用按位与运算符(&)可以取出一个整数的指定位。例如,取出整数 a 的第 3 位,可以使用表达式
(a >> 2) & 1
或者a & (1 << 2) == (1 << 2)
。 - 判断一个整数是否为2的整数次方:如果一个整数是2的整数次方,那么它的二进制表示中只有一位是1,其他位都是0。因此,可以使用按位与运算符(&)判断一个整数是否为2的整数次方。例如,判断整数 n 是否为2的整数次方,可以使用表达式
(n & (n - 1)) == 0
。 - 求一个整数的二进制表示中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;
- 判断最低位的二进制为0 or 1.
- 位运算求最大公约数
相关代码题:
Leetcode:二进制中一的个数
Leetcode: 868 二进制间距
按位或 |
- 按位或运算符的运算规则:0|1=1|0=1|1=1,0|0=0,有1即1
- 设置特定位:使用按位或运算符(|)可以将一个整数的特定位设置为 1。例如,将整数 a 的第 3 位设置为 1,可以使用表达式
a | (1 << 2)
。
int a = 4; // binary: 100
a = a | (1 << 2);
cout << "a: " << a << endl; // binary: 1100
- 合并掩码:使用按位或运算符(|)可以将多个掩码合并为一个掩码。例如,假设有两个掩码 mask1 和 mask2,可以使用表达式 mask1 | mask2 将它们合并为一个掩码。
相关代码题:
按位异或^
- 位异或运算符运算规则:0 ^ 0=1 ^ 1=0,0 ^ 1=1 ^ 0=1
异或运算:相同元素异或为0
- 交换两个值:使用按位异或运算符(^)可以在不使用临时变量的情况下交换两个值。例如,交换整数 a 和 b 的值,可以使用以下代码:
int a = 3, b = 4;
a = a ^ b;
b = b ^ a;
a = a ^ b;
cout << "a: " << a << ", b: " << b << endl;
- 翻转特定位:使用按位异或运算符(^)可以翻转一个整数的特定位。例如,翻转整数 a 的第 3 位,可以使用表达式 a ^ (1 << 2)。
int a = 12; // binary: 1100
a = a ^ (1 << 2);
cout << "a: " << a << endl; // binary: 1000
- 快速判断两个值是否相等:可以使用按位异或运算符(^)快速判断两个值是否相等。例如,判断整数 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 二进制间距