题意:
给你一个整数 n
,请你判断该整数是否是 2
的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2x
,则认为 n
是 2
的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
示例 2:
输入:n = 16
输出:true
解释:24 = 16
示例 3:
输入:n = 3
输出:false
示例 4:
输入:n = 4
输出:true
示例 5:
输入:n = 5
输出:false
提示:
-2^31 <= n <= 2^31 - 1
**进阶:**你能够不使用循环/递归解决此问题吗?
题目来源: https://leetcode.cn/problems/power-of-two/description/
解题方法:
方法一:循环
/**
* @param Integer $n
* @return Boolean
*/
// 循环
function isPowerOfTwo($n) {
$x = 0;
$s = 1;
while($n >= $s){
if($n == $s){
return true;
}
$x++;
$s = pow(2,$x);
}
return false;
}
方法二:递归
//递归
function isPowerOfTwo($n) {
if($n == 1) {
return true;
}
if($n % 2 != 0 || $n == 0){
return false;
}
return $this->isPowerOfTwo($n / 2);
}
方法三:(进阶)位运算
//位运算
//2 的幂转化为二进制,首位为 1,其他都为 0. n & (n - 1) = 0
//注意运算符的优先级,用括号处理
function isPowerOfTwo($n) {
return $n > 0 && (($n & ($n - 1)) == 0);
}