实现一种方法,判断一个整数是否是2的整数次幂(8是2的3次方,返回ture,9不是2的
整数次幂,返回false),要求性能尽可能的高。
利用一个整型变量,让它从1开始不断乘以2,将每一次乘2的结果和目标整数进行对比就可以了
具体做法:
创建一个临时变量temp,初始值定义为1。然后进入一个循环,每次让
temp乘以2,然后个我们的目标值比较,如果相等,则说明我们的目标整数
是2的整数次幂;如果不等,则让我们的temp值变大,继续循环和比较。
当我们的temp值大于目标整数是,说明我们的目标整数不存在。
举个例子
给出我们的整数为11
1*2=2
2*2=4
4*2=8
8*2=16
16>11,所以我们11不是2的整数次幂
如果我们的整数大小是n,我们的时间复杂度就是O(logn)。
def is_power_of_2(num):
temp = 1
while temp <= num:
if temp == num:
return True
temp = temp * 2
return false
print(is_power_of_2(11))
print(is_power_of_2(8))
能不能优化一下,使它的执行速度更快?
可不可以把乘以2的操作变成向左移位,移位的操作比乘法高的多
def is_power_of_2(num):
temp = 1
while temp <= num:
if temp == num:
return True
temp = temp << 1
return False
print(is_power_of_2(8))
print(is_power_of_2(11))
有没有一种更高效的方法呢,实现时间复杂度为O(1)
如果把2的整数次幂转换成2进制数,会有什么特点
十进制数 二进制数 是否为2的整数次幂
8 1000B 是
16 10000B 是
32 100000B 是
64 1000000B 是
100 1100100B 否
如果一个整数是2的整数次幂,那么它变成二进制时,只有最高位是1,其它位都是0
如果我们把这些2的整数次幂都各自减1,再转换成二进制数会有什么特点
十进制数 二进制数 原数值-1 是否为2的整数次幂
8 1000B 111B 是
16 10000B 1111B 是
32 100000B 11111B 是
64 1000000B 111111B 是
100 1100100B 1100011B 否
2的整数次幂一旦减1,它的二进制数字就全部变成1
如果用原数值(2的整数次幂)和它减1的结果进行按位与运算,n&(n-1),结果是什么
十进制数 二进制数 原数值-1 n&n-1 是否是2的整数次幂
8 1000B 111B 0 是
16 10000B 1111B 0 是
32 100000B 11111B 0 是
64 1000000B 111111B 0 是
100 1100100B 1100011B 1100000B 否
0和1按位与运算结果是0,所以凡是2的整数次幂和它本身减1的结果进行与位运算,结果肯定都是
0,反之,如果一个整数不是2的正数次幂结果一定不是0.
所以我们如何判断一个整数是否是2的整数次幂?
对于一个整数n,只需要计算n&(n-1)的结果是不是0,这个算法的时间复杂度就是1
def is_power_of_2_v3(num):
return (num & num-1) == 0
print(is_power_of_2_v3(8))
print(is_power_of_2_v3(11))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79