zoukankan      html  css  js  c++  java
  • 算法:Number of 1 Bits 收藏

    Approach #1 (Loop and Flip) [Accepted]

    Algorithm

    The solution is straight-forward. We check each of the 3232 bits of the number. If the bit is 11, we add one to the number of 11-bits.

    We can check the i^{th}ith​​ bit of a number using a bit mask. We start with a mask m=1m=1, because the binary representation of 11 is,

    0000 0000 0000 0000 0000 0000 0000 00010000 0000 0000 0000 0000 0000 0000 0001

    Clearly, a logical AND between any number and the mask 11 gives us the least significant bit of this number. To check the next bit, we shift the mask to the left by one.

    0000 0000 0000 0000 0000 0000 0000 00100000 0000 0000 0000 0000 0000 0000 0010

    And so on.

    Java

    public int hammingWeight(int n) {
        int bits = 0;
        int mask = 1;
        for (int i = 0; i < 32; i++) {
            if ((n & mask) != 0) {
                bits++;
            }
            mask <<= 1;
        }
        return bits;
    }
    

    Complexity Analysis

    The run time depends on the number of bits in nn. Because nn in this piece of code is a 32-bit integer, the time complexity is O(1)O(1).

    The space complexity is O(1)O(1), since no additional space is allocated.


    Approach #2 (Bit Manipulation Trick) [Accepted]

    Algorithm

    We can make the previous algorithm simpler and a little faster. Instead of checking every bit of the number, we repeatedly flip the least-significant 11-bit of the number to 00, and add 11 to the sum. As soon as the number becomes 00, we know that it does not have any more 11-bits, and we return the sum.

    The key idea here is to realize that for any number nn, doing a bit-wise AND of nn and n - 1n1 flips the least-significant 11-bit in nn to 00. Why? Consider the binary representations of nn and n - 1n1.

    Number of 1 Bits

    Figure 1. AND-ing nn and n-1n1 flips the least-significant 11-bit to 0.

    In the binary representation, the least significant 11-bit in nn always corresponds to a 00-bit in n - 1n1. Therefore, anding the two numbers nn and n - 1n1 always flips the least significant 11-bit in nn to 00, and keeps all other bits the same.

    Using this trick, the code becomes very simple.

    Java

    public int hammingWeight(int n) {
        int sum = 0;
        while (n != 0) {
            sum++;
            n &= (n - 1);
        }
        return sum;
    }
    

    Complexity Analysis

    The run time depends on the number of 11-bits in nn. In the worst case, all bits in nn are 11-bits. In case of a 32-bit integer, the run time is O(1)O(1).

    The space complexity is O(1)O(1), since no additional space is allocated.

    Analysis written by: @noran.

  • 相关阅读:
    Web框架本质及浅谈HTTP协议
    mysql
    jQuery
    Css
    html
    socket编程
    面向对象and类
    模块
    装饰器
    cef network-settings
  • 原文地址:https://www.cnblogs.com/lwy1103/p/9018859.html
Copyright © 2011-2022 走看看