算法题:位 1 的个数

leetcode 地址:位 1 的个数


1. 思路

1.1 方法一

n 每次执行 n % 2 的操作

1.2 方法二

使用位运算,老实说这个方法不知道的估计也想不出,知道也就知道了 😂

2. 代码(方法二)

➥ JavaScript

/**
 * @param {number} n - a positive integer
 * @return {number}
 */
var hammingWeight = function (n) {
  let count = 0

  while (n != 0) {
    count += 1
    n = n & (n - 1)
  }

  return count
};

3. 拓展

再说几个位运算的技巧,记住多少是多少吧。

  • x ^ 0 = x
  • x ^ 1s = ~x
  • x ^ (~x) = 1s
  • x ^ x = 0
  • x & 1 === 1 || x & 1 === 0 可以判断奇偶
  • x & (x - 1) 清除最低位的 1 及后面的 0,就是本题的解法
  • x & -x 得到最低位的 1
  • x & (~0 << n)x 最右边的 n 位清零
  • (x >> n) & 1 获取 xn 位的值(0 or 1)
  • x | (1 << n) 将第 n 位设为 1
  • x & (~(1 << n)) 将第 n 位设为 0
  • x & ((1 << n) - 1)x 最高位至第 n 位(含)清零
  • x & (~((1 << (n + 1)) - 1)) 将第 0 位到第 n 位(含)清零
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值