剑指offer/Python版、JZ11/二进制中1的个数,解题思路详述

剑指offer/Python版、JZ11/二进制中1的个数,解题思路详述

题目:二进制中1的个数

题目描述:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

示例

输入:10 #二进制位0…1010
返回值:2 #1的个数为2

解题思路

本题的解决思路主要是采用按位与运算的思想,首先我们先看一下什么是按位与运算,按位与运算:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。其符号表示为&。
下面简单文字介绍一下本题的解决思路,我们知道1不论是多少位二进制,它只有最后一位是1,其余全是0。所以我们可以将所给数值的32位二进制与1进行按位与操作,记下此时的状态(0/1)。状态0表示该数值的二进制最后一位为0,状态1表示该数值的二进制最后一位为1。然后将该数值的二进制表示逐步往右移动一步,共移动32次(移动次数根据题目所给的多少位确定)。因为我们的目的是为了获得该数值二进制中1的个数,所以我们可以用变量count记录从开始到移动结束后(移动了32次)为1的个数。具体做法可见下述代码部分。

代码实现

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

如果你看完后有所收获,欢迎点赞转发,若文章存在错误,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值