剑指offer——二进制中1的个数(解释n & 0xFFFFFFFF)[通俗易懂]

剑指offer——二进制中1的个数(解释n & 0xFFFFFFFF)[通俗易懂]题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解答如下:环境:python2.7.3正数的原码反码补码都一样负数的补码是其对应正数的反码加1这里需要弄清楚为什么python中负数需要和0xFFFFFFFF做与操作?在计算机中,所有的数字都是使用补码存储起来的。由于Python没有位数这个概念,所以得到二进制表示需要多一点操作,即将位数限制在32位,…

大家好,又见面了,我是你们的朋友全栈君。

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

解答如下:
环境: python 2.7.3

正数的原码反码补码都一样
负数的补码是其对应正数的反码加1

这里需要弄清楚为什么python中负数需要和 0xFFFFFFFF 做与操作?
在计算机中,所有的数字都是使用补码存储起来的。由于Python没有位数这个概念,所以得到二进制表示需要多一点操作,即将位数限制在32位,通过和一个32位的全1数字按位与运算即可。对于正数来说,上面的按位与操作可以不做,因为正数的符号位为0,补码即原码,所以前面的数字全为0,按位与没有意义。但对于负数来说,直接bin(-1)是不能得到其补码的,而是得到了1的原码前面加上了负号,即-0b1。则通过和一个32位的全1数字按位与运算可得到其补码二进制表示对应的十进制数(按位与运算把符号位的1视为了数字)。
在这里插入图片描述
方法一:转换成字符串,然后统计1的个数。

class Solution:
    def NumberOf1(self, n):
        # write code here
        #与操作是对n补码的与操作
        n = 0xFFFFFFFF & n 
        count = 0
        for c in str(bin(n)):
            if c == "1":
                count += 1
        return count

方法二:按位与,统计1的个数。
这个不需要多解释,1做左移运算,右边补0,然后和n相与。

class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        for i in range(32):
            mask = 1 << i
            if n & mask != 0:
                count += 1
        return count

方法三:n和n-1相与
n和n-1做与操作就是把n的二进制的最后一个1变为0,知道n的二进制变为
全0,这样就统计出了1的个数。

class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        while n:
        	if n < 0:
        		n = 0xFFFFFFFF & n
            n = n & (n-1)
            count += 1
        return count
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145808.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS 幻灯片代码(含自动播放)

    JS 幻灯片代码(含自动播放)前端

    2022年7月13日
    18
  • spring 整合 mybatis原理

    spring 整合 mybatis原理SqlSessionFactoryBean的创建1.SqlSessionFactoryBean这个类实现了三个接口,一个是InitializingBean,另一个是FactoryBean,还有就是ApplicationListener接口。下面说明一下实现了这三个接口的,有什么作用InitializingBean接口:实现了这个接口,那么当bean初始化的时候,spring就会调用该接口的实现…

    2022年6月3日
    46
  • oracle 创建emp表,dept表

    oracle 创建emp表,dept表废话不多说直接上SQL/*创建empz表*/CREATETABLEEMP(EMPNONUMBER(4)NOTNULL,ENAMEVARCHAR2(10),JOBVARCHAR2(9),MGRNUMBER(4),HIREDATEDATE,SALNUMBER(7,2),COMMNUMBER(7,2),DEPTNONUMBER(2));/*emp表添加数据*/INSERTINTOEMPVALUES(7369,’SMITH’,’CLE..

    2022年5月12日
    49
  • ADFS配置

    ADFS配置https blog joden123 top 2019 03 11 sso adfs adfs install

    2025年6月13日
    4
  • pycharm导入自定义模块_模块导入速度python

    pycharm导入自定义模块_模块导入速度pythonPycharm是很多Python开发者的首选IDE,如果能把一个工具熟练运用,往往有事半功倍的效果,各种快捷键、重构功能、调试技巧。由于Python是一门动态语言,对于自动导入包模块没有静态语言那么方便,但是我们有了Pycharm,还是可以很强大的。平时写代码的时候,要引用系统自带的模块或者是第三方模块,甚至是项目中其它地方的模块,有时候代码快写了一整屏,为了把一个模块导入进来,我们不得不把光标

    2022年8月26日
    5
  • linux history 历史命令行查询和使用

    linux history 历史命令行查询和使用history命令:用于显示历史记录和执行过的指令命令,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。history命令:是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。默认是不显示命令的执行时间,命令的执行时间,history已经记录,只是没有显示。注:如想查询某个用户在系统上执行了什么命令,可以使用root用户身份登录系统,检查Hom…

    2022年7月14日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号