二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路
- 利用位运算的性质,一个数减去1,在它的二进制表达中,会使得最后一位的1变成0,而该1后面的0会变成1,该1前面的保持不变
- 利用异或运算,
n^(n-1)
以后,会使得n的二进制位中,最后一位的1变成0 - 如24的二进制为
11000
,24-1的二进制为10111
,所以24和(24-1)异或后为10000
,把24最后一位的1变成0 - 执行上述的异或运算,每一次可以把一个数的二进制位中的一个1变为0,所以执行的次数就是该数字二进制位中1的个数
class Solution {
public:
int NumberOf1(int n) {
int cnt=0;
while(n){
//每执行一次(n-1)&n,可以把n的二进制中最后的一位置为0
n=(n-1)&n;
cnt++;
}
return cnt;
}
};