携程校招编程题 bit count

输入一个long类型的数值, 求该数值的二进制表示中的1的个数 .

输入描述:

long 类型的数值

输出描述:

该数值二进制表示中1的个数

输入例子1:

3

输出例子1:

2

例子说明1:

3的二进制表示: 11, 所以1个数为2

输入例子2:

65

输出例子2:

2

例子说明2:

65的二进制为:1000001,所以1的个数为:2

对于负数,符号位是1,直接移位会引起死循环,另外也不能简单的加一个负号,因为负数是用补码存储的,这里有两种解决方案,一种是移动标志位flag

#include 
using namespace std;

int main()
{
    int res=0;
    long num;
    scanf("%ld",&num);
    unsigned long flag=1;
    while(flag){
        if(num&flag) res++;
        flag<<=1;
    }
    cout<

还有一种是将负数强转为无符号类型,但是这样有时会超时?


#include 
using namespace std;

int main()
{
	int res = 0;
	long num;
	cin >> num;
	num = (unsigned long)num;
	while (num) {
		if (num & 1) res++;
		num >>= 1;
	}
	cout << res << endl;
}

最优解法, 可以证明每次n = n & (n-1)操作可以将从左到右最后是1的元素变为0, 所以这样没有无效的移位,速度是最快的。

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count = 0;
        while(n!=0){
            n = n & (n-1);
            count++;
        }
        return count;
    }
}

 

你可能感兴趣的:(算法)