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")