Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion?
Tags
Bit Manipulation
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*** Non-positive number is not a power of n
Using Loop/Recursion
/**
* @param {number} num
* @return {boolean}
*/
var isPowerOfFour = function (num) {
while (num > 1) {
if (num % 4 === 0) {
num = num / 4;
} else {
return false;
}
}
if (num === 0 || num < 0) {
return false;
}
if (num === 1) {
return true;
}
};
/*
* Summarize
* A 4 byte int range:
* -2,147,483,648 to 2,147,483,647
*/
Follow up: without loop solution
Let's find out the rules
Decimal => Binary
1 => 0000 0000 0000 0000 0000 0000 0000 0001
2 => 0000 0000 0000 0000 0000 0000 0000 0010
3 => 0000 0000 0000 0000 0000 0000 0000 0011
4 => 0000 0000 0000 0000 0000 0000 0000 0100
...
8 => 0000 0000 0000 0000 0000 0000 0000 1000
...
We can easily tell that
if the number is multiple of 4, its binary gonna be 100 exponentiation.
So transform the number to binary and get the log of 100 to see whether it returns an int.
/**
* @param {number} num
* @return {boolean}
*/
var isPowerOfFour = function(num) {
if(num <=0 ) {
return false;
}
if(num === 1) {
return true;
}
var log100 = Math.log(parseInt(num.toString(2)))/Math.log(100);
return Math.abs(Math.round(log100) - log100) < 1e-10 ? true : false;
};