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,就可以进行多少次这样的操作。

  • 相关阅读:
    c++中string类中的函数
    二进制
    快速幂
    substring
    hdu 4678
    扩展欧几里得算法
    欧几里得算法
    Floyd_Warshall(任意两点之间的最短路)
    带结构体的优先队列
    php获得远程信息到本地使用的3个函数:file_get_contents和curl函数和stream_get_contents
  • 原文地址:https://www.cnblogs.com/tianyee/p/14004682.html
Copyright © 2011-2022 走看看