JZ11 二进制中1的个数

这篇博客介绍了如何计算一个32位二进制补码表示的整数中1的个数。内容涉及补码的概念,正负整数在计算机中的表示,以及使用位操作计算1的个数的方法。通过一个具体的例子解释了计算过程,展示了如何通过Python实现该功能的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

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

先学习一下什么叫补码

        计算机中的有符号数有三种表示方法,即原码反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机系统中,数值一律用补码来表示和存储。

        正整数的补码是其二进制表示,与原码相同。

        求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。

首先还是要将输入的十进制整数转换为32位的二进制,因为python中没有位数这一概念,在python中通过bin(n & 0xffffffff)获得的并不是这个负数的补码,只是形式与  负数的32位二进制补码相同。

0xffffffff指32个1,等于说取后面32位,一个f四位。

class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        if n < 0:
            n = n & 0xffffffff
        while n:
                count += 1
                n = (n - 1) & n
        return count

假设n是100110,那么n-1就是100101,那么(n-1)& n就是100100

然后100100再减1就是100011,那么(n-1)& n就是100000,再减1就是011111,(n-1)& n就是000000。

所以计算到了1的个数就是3个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值