Power of Two

Power of two is a simple question. Given an integer, you are asked to decide if it is a power of two. Obviously, an integer has only one 1 in its binary representation is a power of two.

But, there is a trap with this question. Let's start from a seems correct solution:

boolean isPowerOfTwo(int n) {
    return (n & -n) == n;
}

This solution is smart. (n & -n) is the integer with only one bit is 1 and that bit is at the position of the first 1 in n's binary representation. And if it equals to n itself, then n only have one bit is 1, so it is a power of two. Sounds good, isn't it? But what about n = 0? It will returns true after all. However, zero is not a power of 2 (BTW, 1 is a power of 2, it's ). So an improved solution might be:

boolean isPowerOfTwo(int n) {
    if (n == 0) return false;
    return ((n & -n) == n);
}

Well, this solution is very nearly to corrent. But there is one thing left. What if the number is the minimal number of integer? It is Integer.MIN_VALUE in java and in its binary representation the first 1 appears at the highest bit. But negative integers can not be a power of a (positive) two, aren't they. So at last, we get the final correct answer:

boolean isPowerOfTwo(int n) {
    return (n > 0) && ((n & -n) == n);
}

There is yet another way. We use (n & (n - 1)) == 0 instead of (n & -n) == n. This works when n is a unsigned integer. But n = 0 must be handled separately. (n & (n - 1)) returns a integer that except for the 1 at the lowest bit position, all bits will be the same as n. So if it returns 0, the number only has one 1 bit. The code is:

boolean isPowerOfTwo(int n) {
    return (n > 0) && ((n & (n - 1)) == 0);
}