位运算相关题目
文章目录
- 位运算相关题目
-
- 一、基础内容
- 二、位运算的实战题目
-
- 2.1 [191. 位1的个数](https://leetcode-cn.com/problems/number-of-1-bits/)
- 2.2 [231. 2 的幂](https://leetcode-cn.com/problems/power-of-two/)
- 2.3 [190. 颠倒二进制位](https://leetcode-cn.com/problems/reverse-bits/)
- 2.5 [51. N 皇后](https://leetcode-cn.com/problems/n-queens/)
- 2.6 [52. N皇后 II](https://leetcode-cn.com/problems/n-queens-ii/)
- 2.7 [338. 比特位计数](https://leetcode-cn.com/problems/counting-bits/)
一、基础内容
1.1 为什么需要位运算
计算机内部是二进制
将十进制转换成二进制:不断除10,余数放最低位
1.2 位运算符
在计算机内部,老的计算机是32个二进制位,新的计算机是64个二进制位。
>>
右移,空出来的二进制位补0<<
左移|
按位或&
按位与~
按位取反^
按位异或(相同为0,不同为1)
1.3 异或的高级用法
x^0=x
x^1s(全1)=~x
(1s=~0)x^(~x)=1s
x^x=0
- 交换两位数:
a^b=c, a^c=b, b^c=a
- 结合法:
a^b^c=a^(b^c)=(a^b)^c
交换两个数,位元算,写法一:
int c = a^b;
a = a^c;
b = b^c;
交换两个数,位元算,写法二:
a = a^b;
b = a^b;
a = a^b;
1.4 指定位置的位运算
-
将x的最右边的n位清0:
x&(~0<<n)
-
获取x第n位的值(0或1):
(x>>n)&1
-
取x的第n位的幂值:
x&(1<<n)
-
仅将第n位置为1:
x|(1<<n)
-
仅将第n位置位0:
x&(~(1<<n))
-
将x最高位及第n位清零:
x&((1<<n)-1)
1.5 (重点)实战要点
-
判断奇偶:
x%2==1
<==>x&1==1
x%2==0
<==>x&1==0
-
x>>1
<==>x/2
既:
mid=(left+right)/2
==》mid=(left+right)>>1
-
清零最低位的1:
x&(x-1)
-
得到最低位的1:
x&(-x)
-
x&~x=0
x^x=0
二、位运算的实战题目
2.1 191. 位1的个数
解法一:转化成二进制字符串,然后计数1的个数
public int hammingWeight(int n) {
String str = Integer.toBinaryString(n);
int res = 0;
for (int i=0; i<str.length(); i++) {
if (str.charAt(i)=='1') res++;
}
return res;
}
解法二:位运算,&1
,然后>>>1
, 高位补零
public int hammingWeight(int n) {
int res = 0;
while (n!=0) {
if ((n&1)==1) {
res++;
}
n=n>>>1;
}
return res;
}
解法三:每次清零最低位的1
public int hammingWeight(int n) {
int res = 0;
while (n!=0) {
n = n & (n-