力扣191. 位1的个数(位运算)
https://leetcode-cn.com/problems/number-of-1-bits/
位运算
class Solution {
public:
int hammingWeight(uint32_t n) {
int result=0;
for(int i=0;i<32;i++)
{
int temp=n&1;
if(temp==1)result++;
n=n>>1;
}
return result;
}
};
复杂度分析
-
时间复杂度:O(k),其中 k 是 int 型的二进制位数,k=32。我们需要检查 n 的二进制位的每一位,一共需要检查 32 位。
-
空间复杂度:O(1),我们只需要常数的空间保存若干变量。
思路和心得:
1.lowbit,二进制最右侧第一个1,的权重
return x & (-x)
2.将二级制,最右侧第一个1,置0
return x & (x - 1)
位运算的由来
在计算机里面,任何数据最终都是用数字来表示的(不管是我们平时用的软件,看的图片,视频,还是文字)。
并且计算机运算单元只认识高低电位,转化成我们认识的逻辑,也就是 0 1 。
这就是导致计算机里面任何数据最终都是用二进制(0 1)来保存的数字。只是我们平时看到的图片、文字、软件都只从二进行数字转化而来的。
位运算符
常用位操作
- 判断奇偶
- (x & 1) == 1 ---等价---> (x % 2 == 1)
- (x & 1) == 0 ---等价---> (x % 2 == 0)
- x / 2 ---等价---> x >> 1
- x &= (x - 1) ------> 把x最低位的二进制1给去掉
- x & -x -----> 得到最低位的1
- x & ~x -----> 0
指定位置的位运算
- 将X最右边的n位清零:x & (~0 << n)
- 获取x的第n位值:(x >> n) & 1
- 获取x的第n位的幂值:x & (1 << n)
- 仅将第n位置为1:x | (1 << n)
- 仅将第n位置为0:x & (~(1 << n))
- 将x最高位至第n位(含)清零:x & ((1 << n) - 1)
- 将第n位至第0位(含)清零:x & (~((1 << (n + 1)) - 1))
异或结合律
x ^ 0 = x, x ^ x = 0
x ^ (~0) = ~x, x ^ x = ~0
a ^ b = c, a ^ c = b, b ^ c = a
(有没有点乘法结合律的意思)
字母表示:(a ^ b) ^ c = a ^ (b ^ c)
图形表示:(☆ ^ ◇) ^ △ = ☆ ^ (◇ ^ △)