Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011
, so the function should return 3.
这题在之前参加高通面试时做过:
思路:
一、位操作,对于每一位都进行&0x1的操作:
int hammingWeight(uint32_t n) {
if (n <= 0)
return 0;
int count = 0;
while(n){
count += (n & 0x1);
n = n >> 1;
}
return count;
}
二、总结规律(从Editorial中学到):
将一个数N写成二进制来看,其最低位为1的位和该数减去1(即N-1)后的0 bit位是一一对应的,因此将数N与N-1得到的结果是将N的最低位1置为0,其他位保持不变,这样循环地进行与的操作,直到N为零时,则知道没有剩余的1 bit了:
int hammingWeight(uint32_t n) {
int count = 0;
while (n != 0) {
count++;
n &= (n - 1);
}
return count;
}
扩展:
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.
Example:
For num = 5
you should return [0,1,1,2,1,2]
.
int* countBits(int num, int* returnSize) {
if (num < 0){
*returnSize = 0;
return NULL;
}
int i;
int *retArray = malloc(sizeof(int) * (num + 1));
for(i = 0; i <= num; i ++)
{
retArray[i] = hammingWeight(i);
}
*returnSize = i;
return retArray;
}