需求:给一个大于零的整数,判断它是不是2的幂,例如2、4、8、16、……

当然可以用循环计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const isPowerOf2 = (x)=> {
if(typeof x !== 'number') {
return false
} else if(x <= 0) {
return false
} else if(x % 1 !== 0) {
return false
}

// 当然可以用循环或递归计算
while(true) {
if(x === 1) {
return true
} else if(x % 2 !== 0) {
return false
}
x = x/2
}
}

但能不能更快点?其实可以

在10进制数中,10就是10^1^、100就是10^2^、1000就是10^3^

而在2进制数中也类似,二进制100就是十进制2^2^

计算机操作二进制数很在行,可以使用位运算

恰好由于进位的原因,2^n^和2^n^-1的每位数截然相反,例如二进制1000就是8、二进制0111就是7

1000 & 0111 = 0,有了这个规律就可以判断更多2的幂了

因为无需循环,时间上当然更胜一筹

1
2
3
4
5
6
7
8
9
10
11
12
const isPowerOf2 = (x)=> {
if(typeof x !== 'number') {
return false
} else if(x <= 0) {
return false
} else if(x % 1 !== 0) {
return false
}

// 但最方便的还是位运算
return (x & (x - 1)) === 0
}