一、题目描述:
输入一个整数,输出改数的二进制表示的1的个数,其中负数用补码表示。
二、解题思路
0)补充知识 : 正数的 反码 补码 都是本身 ,负数的 反码 符号位不变 其余各位取反 补码 反码加1
1) 暴力解法 : 一位一位的遍历统计1个个数 每一位与1相与运算 int类型 要循环32次
2)巧妙解法:如果这个数不为0,那么它的二进制表示中至少有一位为1.
如果将这个数 -1,那么它本身最右边的1则变为0,其余位则不受影响。
在将其与减1后的数相与,则最右边的数变为了0.
如此反复,这个数有多少个1,就可以进行这么多次操作。
直到最后变为0
三、代码实现
class Solution {
public :
int NumberOf1(int n){
int count=0;
while(n){
n=n*(n-1);
count++:
}
return count;
}
};