输入一个整数,输出该数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,就可以进行多少次这样的操作。

posted @ 2020-11-19 11:48  tianyee  阅读(419)  评论(0编辑  收藏  举报