题目:
编写一个函数,该函数接受一个无符号整数,并返回它拥有的“1”位的数量(也称为汉明权重)
Write a function that takes an unsigned integer and return the number of '1' bits it has (also known as the Hamming weight)
Input: 00000000000000000000000000001011 Output: 3 Input: 00000000000000000000000010000000 Output: 1 Input: 11111111111111111111111111111101 Output: 31
思路:
同【剑指offer第二版——面试题15(java)】 https://blog.csdn.net/qq_22527013/article/details/88729605
1. 先把二进制数分为两种,一种是末尾为1,一种是末尾为0
2. 末尾为1的二进制数,减1后,最后一位变为了0,相当于只对最后一位取反,所以n&(n-1)只有最后一位不同,变为0
3. 末尾为0的二进制数,减1后,最右边的1变为0,该1右边的数全变为0,如1100,减1后,变为1011,第二位的1变为0,后两位的0变为1,n&(n-1)得到的为1000,即把原数的最右的1变为了0
4. 总结:把二进制数减1后得到的n-1,和原数n进行与(&)操作后,得到的是原数n在二进制表达中,最右位置的1变为0的数
所以:使用循环,每次对n减1,并count++,直到n=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;
}
}