[Leetcode] Number of 1 Bits 一的位数

509 查看

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