问题:判断一个正整数是否是2的次方(比如16是2的四次方,返回1;不是则返回0)。(要求性能尽可能高)
解法一
1 | int check(int number){ |
思路简单一个一个比较,时间复杂度O(logN)
解法二
1 | int check(int number){ |
通过位运算进行了一点优化,时间复杂度仍然为O(logN),本质上没什么区别
解法三
1 | int check(int number){ |
通过一次减法和与运算,时间复杂度只有O(1),在本质上有很大的优化。
具体思路: 2的n次方数的二进制是有规律的
2: 10 2-1: 1 & 0
4: 100 4-1: 11 & 0
8: 1000 8-1: 111 & 0
16: 10000 16-1: 1111 & 0
32: 100000 32-1: 11111 & 0
... ...
2^n 2^n-1
7: 0111 7-1: 0110 & 0110
36: 100100 36-1: 100011 & 100000
将左右两边的结果做与运算,结果很明显。
2018/10/12
By PQ