Number of 1 Bits
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.
移位法
复杂度
时间 O(1) 空间 O(1)
思路
通过与运算符判断最低位/最高位是否是1,然后再右移/左移。重复此步骤直到原数归零。
注意
右移运算符是算术右移,如果符号位是1的话最高位将补1,符号位是0的话最高位补0。在C/C++中可以先将原数转换成无符号整数再处理,而在Java中可以使用无符号右移算术符>>>。当然,左移的解法就没有这个问题了。
代码
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int mark = 0b1, count = 0;
while(n != 0b0){
if((n & mark)==0b1){
count++;
}
n = n >>> 1;
}
return count;
}
}
减一相与法
复杂度
时间 O(1) 空间 O(1)
思路
该方法又叫Brian Kernighan方法。当原数不为0时,将原数与上原数减一的值赋给原数。因为每次减一再相与实际上是将最左边的1给消去了,所以消去几次就有几个1。比如110,减去1得101,相与得100,消去了最左边的1。
代码
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while(n != 0b0){
n = n & (n - 1);
count++;
}
return count;
}
}