位运算是算法中技巧较多的一个篇章,我将在本篇文章中列举一部分较为重要的内容。
首先我们先申明一个概念在计算机中1大多代表存在的意思,于是我们可以定义一个二进制数为(1001),而它所对应的集合为{0,3}。
先从位运算 几个较为重要的标识符开始。
& 表示按位与,∣ 表示按位或,⊕ 表示按位异或。
&运算
&的定义
&是位运算符,用于对两个二进制数的对应位进行逻辑与操作。对于每一个位,只有当两个二进制数的对应位都为1时,结果位才为1,否则结果位为0。
以你给出的例子为例,a的二进制数为1101,b的二进制数为0101。进行位与运算,对应位进行逻辑与操作,结果为0101。所以1101 & 0101 = 0101。
在数学中,&可以用来表示集合的交集。例如,假设集合A={1, 2, 3, 4},集合B={3, 4, 5},那么A & B表示A和B的交集,即{3, 4}。
{3,2,0}∩{2,0}={2,0}
&的作用
那么&在算题中有哪些重要的作用呢?
如果一个数x是2的幂。
那么
x&(x-1)=0
一个数如果是二进制的幂那么它的二进制表示肯定只有一个1,如下代码推理。
x=10000
x-1=01111
x&(x-1)=0
学会了如何计算2的幂那么去力扣写道题目试一下吧。
&计算2的幂。
python代码如下。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and (n &(n-1)) == 0
c++代码如下:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
};
除了x&(x-1)=0,x&(-x)=x也可以判断x是不是2的幂,推导请自行推导。
&还可以用来计算二进制。
首先我们先来定义>>字符,在二进制中>>表示二进制向右移动一位。例如,在32位整数系统中,如果你有一个二进制数0000 0001 0000 0000
(即十进制的16),并对其进行一次右移操作(>> 1
),结果将是0000 0000 1000 0000
(即十进制的8),因为每一位都向右移动了一位,最左侧的位(即最高位)被丢弃,而在最右侧新增了一位0。
同理<<则是表示二进制向左移动一位。
那么如何表示二进制呢?
二进制的表示。
python代码如下:
n = 12
ans = ""
while n:
# 检查n的最低位是否为1,如果是,则将'1'添加到ans的开头
# 否则添加'0'。但由于我们是从右往左构建字符串,所以直接添加即可。
ans += str(n & 1)
# 将n右移一位,相当于除以2并取整
n >>= 1
# 打印结果,此时ans是从右往左构建的二进制字符串
print(ans)
或则用python里面的内置函数。
n=int(input())
print(bin(n)[2:])
c++代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string a="";
int n ;
cin>>n;
while (n) {
a +=(n & 1)?"1":"0";
// 右移n以检查下一位
n >>= 1;
}
cout<<a << endl; //
return 0;
}
最后再写道题目练练手吧,我们明天再见。