1.题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
2.思路
位运算
考虑n - 1
1) 如果n最后一位是1,减一之后,最后一位变为0,其他数位不变。(1001 - 1 = 1000)
2) 如果n最后一位不是1,如果该整数二进制表示中最右边的1位于第m位,减一之后,第m为由1变0,m位之后的所有0变为1。(1100 - 1 = 1011)
综合前面两种情况,可以得出规律:
n-1 会将最后边的1变为0 如果它的右边还有0,则所有的0变为1
把n 和 (n - 1)做“与”运算,会把整数最右边的1变为0
整数二进制表示中,有多少个1,就可以执行多少次这样的操作。
3.实现
class Solution {
public:
int NumberOf1(int n) {
int res = 0;
while(n != 0)
{
n = n & (n - 1);
res++;
}
return res;
}
};