需求:给一个大于零的整数,判断它是不是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 }
|