Python 如何检查给定的数字是否是2的幂?
下面的代码对某些输入不起作用Python 如何检查给定的数字是否是2的幂?,python,Python,下面的代码对某些输入不起作用 a,i=set(),1 而i使用*2代替位移位。乘法或加法更具可读性。位操作 一种方法是使用位操作: 解释:每2次方的1位正好设置为1(该数字的对数基2索引中的位)。因此,当从中减去1时,该位翻转为0,所有前面的位翻转为1。这使得这两个数是彼此的倒数,所以当对它们进行运算时,我们得到的结果是0 例如: n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0
a,i=set(),1
而i使用*2代替位移位。乘法或加法更具可读性。位操作
一种方法是使用位操作:
解释:每2次方的1位正好设置为1(该数字的对数基2索引中的位)。因此,当从中减去1时,该位翻转为0,所有前面的位翻转为1。这使得这两个数是彼此的倒数,所以当对它们进行运算时,我们得到的结果是0
例如:
n = 8
decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0
| ^ | |
binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0
| ^ | | & 0 1 1 1
index | 3 2 1 0 | | -------
0 0 0 0
-----------------------------------------------------
n = 5
decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4
| | |
binary | 1 0 1 | 1 0 0 | 1 0 1
| | | & 1 0 0
index | 2 1 0 | | ------
1 0 0
总之,当我们从一个数字中减去一,结果是这个数字本身,变成了0,这个数字是2的幂
当然,如果对0
进行任何检查,都会得到0,因此我们添加了n!=0
数学
函数
您总是可以使用一些数学函数,但请注意,如果不小心使用它们,可能会导致错误的结果
导入数学
log(n,2).is_integer()
或:
- 值得注意的是,对于任何
n,bin
builtin为每个严格正整数返回一个字符串“0b1[01]?”
(正则表达式表示法)(即,如果系统内存足够),这样我们就可以编写布尔表达式
'1' not in bin(abs(n))[3:]
这将为n
生成True
,它等于0
、1
和2**k
1
是2**0
因此它无疑是二的幂,但0
不是,除非你考虑k的x=2**k
的限制→ -∞代码>。在第二种假设下,我们可以简单地写
check0 = lambda n: '1' not in bin(abs(n))[3:]
在第一个下(不包括0
)
当然,这里提出的解决方案只是众多可能的解决方案之一
您可以使用检查一个数字是否是二的幂。。。当然不是最重要的
效率很高,但为了完整起见,我发布了它:-)
请参阅优秀且详细的-for C#。同样使用的等效Python实现是:
def is_power_of_two(n):
return (n != 0) and (n & (n-1) == 0)
同样,这适用于任何整数n
,只要它适合内存
简单总结一下上面引用的答案:逻辑和
运算符前面的第一个术语,只是检查n
是否不是0,因此不是2的幂。第二项通过确保按位和操作后的所有位均为0,检查它是否为2的幂。按位运算的设计仅适用于2次幂的True
,但有一个例外:如果n
(因此其所有位)一开始都是0
除此之外:作为对这两个术语的评估,如果在特定的用例中,给定的n
不太可能是0,而不是2的幂,那么颠倒它们的顺序会更有效。我编写了一个python函数,它将检查任何数字的幂:
import math
def checkPowTwo(num):
x = int(input("The power of the number to be calculated is: "))
output = math.log(num, x)
residue = output - int(output)
if residue == 0:
print (num, " is a power of the number desired.")
else:
print (num, " is not a power of the number desired.")
y = checkPowTwo(int(input()))
注意:这应该是对Tomerikoo的答案(目前投票最多)的评论,但不幸的是,由于声誉问题,Stack Overflow不允许我评论
托梅里库的回答得到了很好的解释和思考。虽然它涵盖了大多数应用程序,但我认为需要稍加修改,以使它在处理一个小问题时更加健壮。他们的答案是:
(n&(n-1)==0)和n!=0
第二部分检查输入是否为实际0,这将使按位and逻辑无效。当这种情况发生时,还有另一种简单的情况:输入为1,按位并与0再次发生,就在第二项上。严格来说,2^0=1
当然,但我怀疑它对大多数应用程序是否有用。考虑到这一点,一个微不足道的修改是:
(n&(n-1)==0)和(n!=0和n-1!=0)
以下代码检查n是否为2的幂:
def power_of_two(n):
count = 0
st = str(bin(n))
st = st[2:]
for i in range(0,len(st)):
if(st[i] == '1'):
count += 1
if(count == 1):
print("True")
else:
print("False")
许多初学者不知道像(n!=0)和(n&(n-1)==0)
这样的代码是如何工作的。
但是如果我们想检查一个数字是否是2的幂,我们可以把它转换成二进制格式,看得很清楚
例如:
^(授权)
2^0=1(仓位值:0000 0001)
2^1=2(仓位值:0000 0010)
2^2=4(仓位值:0000 0100)
2^3=8(仓位值:0000 1000)
2^4=16(仓位值:0001 0000)
2^5=32(仓位值:0010 0000)
2^6=64(仓位值:0100 0000)
2^7=128(仓位值:1000 0000)
如果查看2的所有幂的二进制值,可以看到只有一位True
。这就是这个程序的逻辑
因此,如果我们计算二进制数中1位的数量,如果它等于1,那么给定的数字是2的幂,否则就不是。严格来说,1=2^0
是2的幂-但我同意这是一个边缘案例,根据用例的不同可能很重要。你是对的@CallMeStag,也许我是在为自己的应用程序设计隧道愿景(我的下一步是在此基础上展开,如果提供的整数还不是2的幂,请找到下一个更高的数字)。为calrity编辑了一点。
check1 = lambda n: '1' not in bin(abs(n))[3:] and n != 0
def is_power_of_two(n):
return (n != 0) and (n & (n-1) == 0)
import math
def checkPowTwo(num):
x = int(input("The power of the number to be calculated is: "))
output = math.log(num, x)
residue = output - int(output)
if residue == 0:
print (num, " is a power of the number desired.")
else:
print (num, " is not a power of the number desired.")
y = checkPowTwo(int(input()))
def power_of_two(n):
count = 0
st = str(bin(n))
st = st[2:]
for i in range(0,len(st)):
if(st[i] == '1'):
count += 1
if(count == 1):
print("True")
else:
print("False")