【Python】剑指offer 15:二进制中1的个数

位运算

把数字用二进制表示之后,对每一位上0或者1的运算。
包含五种运算:与、或、异或、左移、右移

  • 左移
    运算符:m << n,表示把 m 左移 n 位。
    在左移 n 位的时候,最左边的 n 位被丢弃,右边不上 n 个0。
    比如:
    00001010 << 2 = 00101000
    10001010 << 3 = 01010000
  • 右移
    运算符:m >> n,表示把 m 右移 n 位。
    在右移 n 位的时候,最右边的 n 位被丢弃。但是如果数字是一个无符号数值,则用 0 填补最左边的 n 位;如果数字是一个有符号数值,则右移之后在最左边补 1.
    比如:
    00001010 >> 2 = 00000010(正数,左边补 0)
    10001010 >> 3 = 11110001(负数,左边补 1)

题目:二进制中 1 的个数。实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把9表示成二进制是 1001,有 2 位是 1。
思路
如果把一个整数 n 减去 1,都是把最右边的 1变成 0.如果右边还有 0,则所有 0 变成 1,而它所有位不变。
接下来把 n 和 n-1 做与运算,相当于把最右边的 1 变成 0。
如:
1100 减去 1 = 1011
1100 & 1011 = 1000
二进制中有几个 1 ,就要进行几次运算。
代码

class Solution:
    def NumberOf1(self, n):
        count = 0
        while n:
            count = count + 1
            n = (n - 1) & n
        return count
s = Solution()
print(s.NumberOf1(9))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值