问题:
如果判断一个正整数是否是 2 的整次幂
解法1:
创建变量 temp 初始值为 1,与目标整数相比较,如果小于,则 temp = temp * 2 继续比较,如果相等,则目标整数为 2 的整次幂,如果大于,则目标整数不为 2 的整次幂
实现代码:
function isPowerOfV1(num: number){
let temp = 1;
while(temp <= num) {
if(temp === num) return true
temp = temp << 1
}
return false
}
时间复杂度为 O(logn)
解法2:
为 2 的整次幂的正整数都有一个特点,即:转换为 2 进制之后,除了最高位为 1,其余位都为0
例如:
2 => 10
4 => 100
6 => 110
8 => 1000
得出,当为 2 的整次幂,与其 减 1 的数,做 按位与 运算时,结果一定为 0,
实现代码
function isPowerOfV2(num:number) {
return (num & (num - 1)) === 0
}
摘要总结自: 漫画算法 小灰的算法之旅