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.

  • 相关阅读:
    C语言编程如何实现输出一个回型递增的N阶矩阵(螺旋矩阵)
    cookie测试要点
    一个网页怎么开展测试
    web和app区别
    app功能测试
    复习Linux笔记
    学习python
    微信小程序测试流程
    Redis
    记录
  • 原文地址:https://www.cnblogs.com/lwy1103/p/9018859.html
Copyright © 2011-2022 走看看