力扣191. 位1的个数(位运算)

力扣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)来保存的数字。只是我们平时看到的图片、文字、软件都只从二进行数字转化而来的。


位运算符

image.png


常用位操作

  1. 判断奇偶
  • (x & 1) == 1 ---等价---> (x % 2 == 1)
  • (x & 1) == 0 ---等价---> (x % 2 == 0)
  1. x / 2 ---等价---> x >> 1
  2. x &= (x - 1) ------> 把x最低位的二进制1给去掉
  3. x & -x -----> 得到最低位的1
  4. x & ~x -----> 0

指定位置的位运算

  1. 将X最右边的n位清零:x & (~0 << n)
  2. 获取x的第n位值:(x >> n) & 1
  3. 获取x的第n位的幂值:x & (1 << n)
  4. 仅将第n位置为1:x | (1 << n)
  5. 仅将第n位置为0:x & (~(1 << n))
  6. 将x最高位至第n位(含)清零:x & ((1 << n) - 1)
  7. 将第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)
图形表示:(☆ ^ ◇) ^ △ = ☆ ^ (◇ ^ △)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值