剑指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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开源!!!100 多个常用 API 数据接口免费分享!建议收藏![通俗易懂]

    开源!!!100 多个常用 API 数据接口免费分享!建议收藏![通俗易懂]点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方有惊喜留言必回,有问必答!每天08:15更新文章,每天进步一点点…我们在开发的过程中,常常调用API接口,往往事半功倍。今天给大家整理了优秀的API接口!各类无次数限制的免费API接口整理,主要是聚合数据上和APIStore上的一些,还有一些其他的。聚合数据提供30大类,160种以上基…

    2022年9月17日
    1
  • centos 安装 python3_centos运行python脚本

    centos 安装 python3_centos运行python脚本注意:以下教程是让centOS7里面的Python2和Python3共存,并不是替换Python2。一、检查系统是否有gccgcc–version ——查询是否安装gcc-v——查询版本如果没有显示就执行下面yum安装gcc #查看gcc安装包yumsearchgcc#安装gccyum -yinstallgcc 安装下面依赖库(65个,…

    2022年9月16日
    2
  • 线程池如何创建线程_创建线程池的七个参数

    线程池如何创建线程_创建线程池的七个参数Executors如何创建线程池?Executors类是从JDK1.5开始就新增的线程池创建的静态工厂类,它就是创建线程池的,但是很多的大厂已经不建议使用该类去创建线程池。原因在于,该类创建的很多线程池的内部使用了无界任务队列,在并发量很大的情况下会导致JVM抛出OutOfMemoryError,直接让JVM崩溃,影响严重。但是Executors类究竟是如何使用…

    2022年9月27日
    2
  • [面试] Golang 面试题

    [面试] Golang 面试题本文章收录于:后端工程师面试题目总结(提供参考答案)目录1.make与new的区别2.简要描述go中的main和init函数的区别3.下面的代码输出什么,若会报错报什么错?4.这段代码会输出什么?5、简述channel和mutex锁机制的原理异同与使用场景6、sync.WaitGroup的使用场景?7、写一段闭包代码,阐述其作用8、执行这段代码会发生什…

    2022年6月29日
    28
  • 并查集

    并查集

    2021年9月13日
    48
  • Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配

    Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配AndroidAutoSize框架 1.链接https://github.com/JessYanCoding/AndroidAutoSize 2.使用 2.1.添加Gradle配置implementation’me.jessyan:autosize:1.1.2′  2.2.添加AndroidManifest配置&lt;manifest&gt;…

    2022年6月4日
    45

发表回复

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

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