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


相关推荐

  • 做计算机项目的流程图,软件工程实验三(程序流程图和PAD图)[通俗易懂]

    做计算机项目的流程图,软件工程实验三(程序流程图和PAD图)[通俗易懂]《软件工程实验三(程序流程图和PAD图)》由会员分享,可在线阅读,更多相关《软件工程实验三(程序流程图和PAD图)(2页珍藏版)》请在人人文库网上搜索。1、软件工程实验三(程序流程图和PAD图)SHANGHAIUNIVERSITY实验报告学院计算机工程与科学学院学姓号名10122030王杰陈圣波2013.12指导老师日期实验三下面为模块“产生毕业典礼学生表”的功能描述…

    2022年8月13日
    11
  • Mysql 修改列的顺序

    Mysql 修改列的顺序

    2021年9月8日
    50
  • 谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」

    谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」最近一直在接触图形学相关的知识,感觉之前在学OpenGL的时候不需要思考帧缓冲是怎么处理到显示器上的,驱动都帮我做好了,现在在接触vulkan的时候发现自己对Swapchain这个东西的工作原理不是很了解,去网上搜索资料的过程中发现了垂直同步这个知识点,以前玩游戏的时候也经常看到但是不明白什么意思(对不起!我不是一个合格的游戏玩家>-<),觉得自己还是得搞清楚一下,于是整理了一下自己对…

    2022年6月10日
    47
  • Java练习—-》求字符串中的最长回文子串

    Java练习—-》求字符串中的最长回文子串手贱,做了一道对于我来说挺难的题目嘿嘿!挺有意思的,分享一下文章目录前言一,题目二,思路图形解析代码前言第一次把自己的解题思维写出来,可能写的不太好,请给位原谅,哈哈哈哈额,如果有错的,请各位大佬帮我指出来哈,谢谢!!(^U^)ノ~YO一,题目求一串字符串的最长回文子串,这里以cabacabae为例二,思路图形解析第一步:观察这串字符串—》第二步:找出最长回文子串,并设数—》说明:在这里,假设知道最长回文子串,那这里的resCenter和maxRigth,reslengthgs

    2022年10月16日
    2
  • ddr2 odt_ddr2电压

    ddr2 odt_ddr2电压经常有人会说支持DDR2的主板存在偷工减料的现象。事实上这是由于DDR2内存中使用了一项新的ODT技术,它可以在提高内存信号稳定性的基础上节省不少电器元件。主板终结是一种最为常见的终结主板内干扰信号的方法。在每一条信号传输路径的末端,都会安置一个终结电阻,它具备一定的阻值可以吸收反射回来的电子。但是目前DDR2内存的工作频率太高了,这种主板终结的方法并不能有效的阻止干扰信号。若硬要采用主板终结

    2025年10月10日
    4
  • MediaCodec基本原理及使用「建议收藏」

    MediaCodec基本原理及使用「建议收藏」MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。广义而言,MediaCodec的工作原理就是处理输入数据以产生输出数据。具体来说,MediaCodec在编解码的过程中使用了一组输入/输出缓存区来同步或异步处理数据:首先,客户端向获取到的编解码器输入缓存区写入要编解码的数据并将其提交

    2022年4月19日
    150

发表回复

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

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