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;
}