二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
考察知识点: 与、或和异或操作。以及位移操作,
注意: 在右移n位的过程中,如果数字是一个无符号数,用0填补最左边的n位,如果数字是一个有符号的数,用数字的符号位填充最左边n位。左移是在左边补0
解法一: 将n与n-1进行&运算,例如:110 - 1 = 101, 110 & 101 = 100,每一次减去1可以将最右侧的1变为0,这个1右侧的所有0变为1,利用这个性质,就可以快速找出一个个数。
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while(n){
count++;
n = n & (n-1);
}
return count;
}
};
解法二: 声明一个无符号 的标志数1,将n与标志数进行与运算,判断是否为0,如果为0表示此位置为0,否则相反,然后将标志位左移,重复上述过程。
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
unsigned int flag = 1;
while(flag){
if(flag & n){
count++;
}
flag = flag<<1; //flag左移后是返回一个临时值,不是在原值上运算的。一定要记住
}
return count;
}
};