剑指offer二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路1

  1. 整数和1进行与运算,为True,count值就+1
  2. 否则整数就右移一位
  3. 直到<0
  4. 由于python的存储机制,当整数为负数时,需先将整数控制在32位字节(n=n&0xffffffff)
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        if not n:
            return 0
        count=0
        if n<0:
            n=n&0xffffffff
        while n:
            if n&1==1:
                count+=1
            n>>=1
        return count

思路2

  1. 把整数-1再和原整数与,就能将整数最右边的1变为0
  2. 直到整数全为0
  3. 用一个count记录循环的次数即为1的个数
# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        if not n:
            return 0
        count=0
        if n<0:
            n=n&0xffffffff
        while n>0:
            n=n&(n-1)
            count+=1
        return count

测试用例

if __name__=='__main__':
    s=Solution()
    n1=6
    n2=-1
    print(s.NumberOf1(n1))
    print(s.NumberOf1(n2))

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值