题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
1、思路分析
自己没有思路,搬运的评论区大佬的解释。我们先来看看二进制表示形式下的整数减去1会发生什么,假设一个整数不为0,例如1100,1100-1=1011,可以看出,减去1的结果为最右边的1变为0,最右边的1后面的0(如果有)全部变为1,即从最右边的1,到最右边一位,所有位的结果变成了相反数,我们考虑按位与运算,即将原整数和减去1后的整数做按位与运算,从最右边的一个1开始,其右边所有位都会变为0,因此又会出现新的最右边的1,持续下去,该整数有多少个1,就能进行多少次这样的操作,直到原整数为0。
2、代码
public class Solution { public int NumberOf1(int n) { int count = 0; while(n != 0) { count++; n = n & (n-1); } return count; } }
3、复杂度分析
待续