有关位运算的操作符
>>
<<
&
|
^
~
常见位运算操作
给定一个数,确定它的二进制中第x位是0还是1
(n >> x) & 1;
将一个数n的二进制中第x位修改为1
n |= (1 << x)
将一个数n的二进制中第x位修改为0
n &= (~(1 << x))
提取一个数二进制中最右侧的1
n & (-n)
去掉一个数中二进制最右侧的1
n & (n-1)
异或运算律
- a ^ a = 0
- a ^ 0 = a
- a ^ b ^ c = a ^ (b ^ c)
191. 位1的个数 - 力扣(LeetCode)
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 1:
输入: n = 00000000000000000000000000001011
输出: 3
解释: 输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入: n = 00000000000000000000000010000000
输出: 1
解释: 输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入: n = 11111111111111111111111111111101
输出: 31
解释: 输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
解题思路
n & (n-1)每次可以干掉二进制中最右侧的1
代码实现
class Solution {
public:
int hammingWeight(uint32_t n)
{
int ret = 0;
while(n != 0)
{
n &= n-1;
ret++;
}
return ret;
}
};
338. 比特位计数 - 力扣(LeetCode)
给你一个整数 n
,对于 0 <= i <= n
中的每个 i
,计算其二进制表示中 1
的个数 ,返回一个长度为 n + 1
的数组 ans
作为答案。
示例 1:
输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入: n = 5
输出: [0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
解题思路
利用n&(n-1)从最高位开始统计位1的个数,将结果存放到vector中即可。时间复杂度O(n^2)
代码实现
class Soluti