Count number of 1's in binary representation

后端 未结 21 1934
天涯浪人
天涯浪人 2020-11-28 01:32

Efficient way to count number of 1s in the binary representation of a number in O(1) if you have enough memory to play with. This is an interview question I found on an onli

相关标签:
21条回答
  • 2020-11-28 02:09

    By utilizing string operations of JS one can do as follows;

    0b1111011.toString(2).split(/0|(?=.)/).length // returns 6
    

    or

    0b1111011.toString(2).replace("0","").length  // returns 6
    
    0 讨论(0)
  • 2020-11-28 02:12

    I've got a solution that counts the bits in O(Number of 1's) time:

    bitcount(n):
        count = 0
        while n > 0:
            count = count + 1
            n = n & (n-1)
        return count
    

    In worst case (when the number is 2^n - 1, all 1's in binary) it will check every bit.

    Edit: Just found a very nice constant-time, constant memory algorithm for bitcount. Here it is, written in C:

    int BitCount(unsigned int u)
    {
         unsigned int uCount;
    
         uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
         return ((uCount + (uCount >> 3)) & 030707070707) % 63;
    }
    

    You can find proof of its correctness here.

    0 讨论(0)
  • 2020-11-28 02:13

    The best way in javascript to do so is

    function getBinaryValue(num){
     return num.toString(2);
    }
    
    function checkOnces(binaryValue){
        return binaryValue.toString().replace(/0/g, "").length;
    }
    

    where binaryValue is the binary String eg: 1100

    0 讨论(0)
  • 2020-11-28 02:13

    There's only one way I can think of to accomplish this task in O(1)... that is to 'cheat' and use a physical device (with linear or even parallel programming I think the limit is O(log(k)) where k represents the number of bytes of the number).

    However you could very easily imagine a physical device that connects each bit an to output line with a 0/1 voltage. Then you could just electronically read of the total voltage on a 'summation' line in O(1). It would be quite easy to make this basic idea more elegant with some basic circuit elements to produce the output in whatever form you want (e.g. a binary encoded output), but the essential idea is the same and the electronic circuit would produce the correct output state in fixed time.

    I imagine there are also possible quantum computing possibilities, but if we're allowed to do that, I would think a simple electronic circuit is the easier solution.

    0 讨论(0)
  • 2020-11-28 02:15

    The function takes an int and returns the number of Ones in binary representation

    public static int findOnes(int number)
    {
    
       if(number < 2)
        {
            if(number == 1)
            {
                count ++;
            }
            else
            {
                return 0;
            }
        }
    
        value = number % 2;
    
        if(number != 1 && value == 1)
            count ++;
    
        number /= 2;
    
        findOnes(number);
    
        return count;
    }
    
    0 讨论(0)
  • 2020-11-28 02:16

    That's the Hamming weight problem, a.k.a. population count. The link mentions efficient implementations. Quoting:

    With unlimited memory, we could simply create a large lookup table of the Hamming weight of every 64 bit integer

    0 讨论(0)
提交回复
热议问题