【编程题】【牛客网】二进制中1的个数

剑指offer15题

由于除法效率比移位运算慢得多,所以本文使用移位运算符>>代替除以2的操作。

 

一、整数与1做与运算,每次右移

二、整数与flag做与运算,flag每次左移

三、整数与(整数-1)做与运算,直至与运算结果为0

 

一、该方法可以很好的处理正数,但在处理负数时,右移操作之后需要将首位置一,这样会导致最后生成0xFFFFFFFF,陷入死循环,所以推荐方法2

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        for i in range(32):
            count += (n >> i) & 1
        return count

二、

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        flag = 1
        for _ in range(32):
            count += n & flag
            flag = flag << 1
        return count

三、每次做一次n&(n-1),n的二进制表示中的最后一位的1都会变成0

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        for _ in range(32):
            n = n & (n-1)
            if n:
                count += 1
        return count

本文来自程序媛驿站,未经授权不得转载.

如有需要请公众号后台联系

(欢迎转发到朋友圈~)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值