Count number of 1's in binary representation

后端 未结 21 1932
天涯浪人
天涯浪人 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:19

    I came here having a great belief that I know beautiful solution for this problem. Code in C:

        short numberOfOnes(unsigned int d) {
            short count = 0;
    
            for (; (d != 0); d &= (d - 1))
                ++count;
    
            return count;
        }
    

    But after I've taken a little research on this topic (read other answers:)) I found 5 more efficient algorithms. Love SO!

    There is even a CPU instruction designed specifically for this task: popcnt. (mentioned in this answer)

    Description and benchmarking of many algorithms you can find here.

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

    The below method can count the number of 1s in negative numbers as well.

    private static int countBits(int number)    {
        int result = 0;
        while(number != 0)  {
            result += number & 1;
            number = number >>> 1;
        }
        return result;
    }
    

    However, a number like -1 is represented in binary as 11111111111111111111111111111111 and so will require a lot of shifting. If you don't want to do so many shifts for small negative numbers, another way could be as follows:

    private static int countBits(int number)    {
        boolean negFlag = false;
        if(number < 0)  { 
            negFlag = true;
            number = ~number;
        }
    
        int result = 0;
        while(number != 0)  {
            result += number & 1;
            number = number >> 1;
        }
        return negFlag? (32-result): result;
    }
    
    0 讨论(0)
  • 2020-11-28 02:20

    That will be the shortest answer in my SO life: lookup table.

    Apparently, I need to explain a bit: "if you have enough memory to play with" means, we've got all the memory we need (nevermind technical possibility). Now, you don't need to store lookup table for more than a byte or two. While it'll technically be Ω(log(n)) rather than O(1), just reading a number you need is Ω(log(n)), so if that's a problem, then the answer is, impossible—which is even shorter.

    Which of two answers they expect from you on an interview, no one knows.

    There's yet another trick: while engineers can take a number and talk about Ω(log(n)), where n is the number, computer scientists will say that actually we're to measure running time as a function of a length of an input, so what engineers call Ω(log(n)) is actually Ω(k), where k is the number of bytes. Still, as I said before, just reading a number is Ω(k), so there's no way we can do better than that.

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