问题:给定一个数字,判断他是否为2的n次方
第一种方法:我们会发现如果是数字符合2的n次方的话,他有一个特点:就是让他一直除以2最终他会得到1.否则的话就不符合条件。所以就会写出一下代码
def power_2(n):
if n == 0:
return False
while(n % 2 == 0 ):
n = n / 2
if n == 1:
return True
else:
return False
print(power_2(0))
然而还会有更为简单的算法,那就是位运算。我们会发现符合2的n次方的数字x如果转换为二进制都是符合10000…这种形式。然后重点来了!! 我们如果求这个数减一(x-1)的二进制会得到01111…这种形式。这里我画图说明:
所以满足x与x-1进行与运算为0的数字就是符合条件的数字,这种方法比上面要快很多,因为计算机就是处理二进制要很快。大家可以测试一下
def power_2(n):
if n == 0 or n == 1:
return False
else:
if (n & (n - 1)) == 0:
return True
else:
return False
print(power_2(256))
这种算法会比上面简洁很多,所以说要好好掌握位运算!这是一种很高效的方法