zoukankan      html  css  js  c++  java
  • 输入一个整数,输出该数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,就可以进行多少次这样的操作。

  • 相关阅读:
    在VMWare的虚拟机中设置共享文件夹(Linux-Ubuntu系统)
    得到cell视图
    推送
    常用框架
    截屏
    多线程枷锁
    java与IOS的交互
    缓存机制
    iOS数据库操作(使用FMDB)
    插入排序
  • 原文地址:https://www.cnblogs.com/tianyee/p/14004682.html
Copyright © 2011-2022 走看看