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


    首先我刚开始想到的就是最蠢的办法,正数除2取余法,然后负数变成2的32次减去原来的数(肯定是一个正数),进而继续求新得到的正数的1的个数,不过要注意,2的32次已经正好达到int类型的边界,所以用long类型。

    但是看了别的大佬的代码和帖子,发现真的牛批,因为计算机本来就是所有数都用补码进行存储,那么我只需要从补码中找规律即可。

    规律:n的补码和n-1的补码进行按位与运算,得到的结果res 等于 n的补码将最右面的第一个1变成0,其余位照抄。

      其实不仅是补码,所有二进制表示的数,与比它小1的二进制数按位与运算,那么该二进制数最右面的第一个1变为0,其余位照抄。

      一个数n,减去1之后,那么n的二进制的最右面一个1变成0,且其右面的所有0变成1,所以n-1与n按位与的结果是n从最右面的1开始全部变成0,一个二进制数n有多少个1,就可以进行多少次这样的操作。

  • 相关阅读:
    主进程与渲染进程的异同
    Electron node integration enabled 设置
    JS-函数总结
    JS-变量、作用域、垃圾回收机制总结
    python进阶知识笔记
    高级抽象函数
    mac支持的文件系统
    生成器generator & 迭代器iterator
    磁盘如何做才能让系统识别
    winPE盘能做什么
  • 原文地址:https://www.cnblogs.com/tianyee/p/14004682.html
Copyright © 2020-2023  润新知