Find if a number is a power of two without math function or log function

后端 未结 6 878
猫巷女王i
猫巷女王i 2020-11-30 19:27

I want to find if a user entered number is a power of two or not.

My code doesn\'t work.

public class power_of_two
{  
    public static void main         


        
6条回答
  •  执笔经年
    2020-11-30 19:55

    You can test if a positive integer n is a power of 2 with something like

    (n & (n - 1)) == 0
    

    If n can be non-positive (i.e. negative or zero) you should use

    (n > 0) && ((n & (n - 1)) == 0)
    

    If n is truly a power of 2, then in binary it will look like:

    10000000...
    

    so n - 1 looks like

    01111111...
    

    and when we bitwise-AND them:

      10000000...
    & 01111111...
      -----------
      00000000...
    

    Now, if n isn't a power of 2, then its binary representation will have some other 1s in addition to the leading 1, which means that both n and n - 1 will have the same leading 1 bit (since subtracting 1 cannot possibly turn off this bit if there is another 1 in the binary representation somewhere). Hence the & operation cannot produce 0 if n is not a power of 2, since &ing the two leading bits of n and n - 1 will produce 1 in and of itself. This of course assumes that n is positive.

    This is also explained in "Fast algorithm to check if a positive number is a power of two" on Wikipedia.


    Quick sanity check:

    for (int i = 1; i <= 100; i++) {
        if ((i & (i - 1)) == 0)
            System.out.println(i);
    }
    
    1
    2
    4
    8
    16
    32
    64
    

提交回复
热议问题