I need a function like this:
// return true iff 'n' is a power of 2, e.g.
// is_power_of_2(16) => true is_power_of_2(3) => false
bool is_power_of_2(int n);
Can anyone suggest how I could write this? Can you tell me a good web site where this sort of algorithm can be found?
This isn't the fastest or shortest way, but I think it is very readable. So I would do something like this:
This works since binary is based on powers of two. Any number with only one bit set must be a power of two.
Powers of two in binary look like this:
Note that there is always exactly 1 bit set. The only exception is with a signed integer. e.g. An 8-bit signed integer with a value of -128 looks like:
So after checking that the number is greater than zero, we can use a clever little bit hack to test that one and only one bit is set.
For more bit twiddling see here.
This is the fastest:
Approach #1:
Divide number by 2 reclusively to check it.
Time complexity : O(log2n).
Approach #2:
Bitwise AND the number with its just previous number should be equal to ZERO.
Example: Number = 8 Binary of 8: 1 0 0 0 Binary of 7: 0 1 1 1 and the bitwise AND of both the numbers is 0 0 0 0 = 0.
Time complexity : O(1).
Approach #3:
Bitwise XOR the number with its just previous number should be sum of both numbers.
Example: Number = 8 Binary of 8: 1 0 0 0 Binary of 7: 0 1 1 1 and the bitwise XOR of both the numbers is 1 1 1 1 = 15.
Time complexity : O(1).
http://javaexplorer03.blogspot.in/2016/01/how-to-check-number-is-power-of-two.html
If you have a modern Intel processor with the Bit Manipulation Instructions, then you can perform the following. It omits the straight C/C++ code because others have already answered it, but you need it if BMI is not available or enabled.
GCC, ICC, and Clang signal BMI support with
__BMI__
. It's available in Microsoft compilers in Visual Studio 2015 and above when AVX2 is available and enabled. For the headers you need, see Header files for SIMD intrinsics.I usually guard the
_blsr_u64
with an_LP64_
in case compiling on i686. Clang needs a little workaround because it uses a slightly different intrinsic symbol nam:This website is often cited: Bit Twiddling Hacks.
This is the bit-shift method in T-SQL (SQL Server):
It is a lot faster than doing a logarithm four times (first set to get decimal result, 2nd set to get integer set & compare)