A smart way to determine if a number is a power of 2 using bit operations[1] :
Note that 0 is incorrectly detected as a power of 2 by this algorithm. As a result, one must first check whether x is non-zero.
If x is a power of 2, then the binary representation of x looks like :
10000000
Consequently,
x - 1 = 10000000 - 00000001 = 01111111
If we take the bitwise AND of x and x-1, we get 0.
x & (x - 1) = 10000000 & 01111111 = 00000000
On the other hand, if x is not a power of 2, the change in the bits caused by subtracting 1 will only propagate as far as the least significant bit which is set to 1 i.e. the first 1 from the right. Bits to the left to this bit will not be affected. As a result, the most significant bit which is set to 1 i.e the first 1 from the left remains unchanged in x - 1. So, x & (x-1) will not be equal to zero because they have at least one common bit set to 1.
Here's an example:
x = 10000100
x-1 = 10000100 - 00000001 = 10000011
x & (x - 1) = 10000100 & 10000011 = 10000000
Note that 0 is incorrectly detected as a power of 2 by this algorithm. As a result, one must first check whether x is non-zero.
The following code snippet implements the algorithm :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
bool is_power_of_two(int n){ | |
return x && !(x & (x - 1)); | |
} |
No comments:
Post a Comment