剑指offer-11.二进制中1的个数-Python

11.二进制中1的个数

题目描述

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

记录

方法一:
直接转成二进制数,然后遍历求“1”的个数。
直接调用count()也可以,思想一样就行。

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        count=0
        n = n&0xFFFFFFFF  
        for i in str(bin(n)):
            if i == '1':
                count+=1
        return count

方法二:位与

1. n < 0
网站大佬的解释:对于负数,最高位为1,而负数在计算机是以补码存在的,往右移,符号位不变,符号位1往右移,最终可能会出现全1的情况,导致死循环。与0xffffffff相与,就可以消除负数的影响.

0xffffffff ( =2 ^ 31 +2 ^ 30+…+2 ^ 1+2 ^ 0=- 2 ^ 31+2 ^ 31-1=-1)

具体可参考:Python中为什么可以通过bin(n & 0xffffffff)来获得负数的补码?

2. n = 0
无意义
3. n > 0
3 -> 00000011
count = 1:3&2 = 00000011 & 00000010 = 00000010
count = 2:2&1 = 00000010 & 00000001 = 00000000

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        while n & 0xffffffff != 0:
            count += 1
            n = n & (n-1)
        return count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值