当前位置: 首页 > 面试题库 >

如何检查给定数字是否为2的幂?

慕飞章
2023-03-14
问题内容

下面的代码不适用于某些输入。

a, i = set(), 1
while i <= 10000:
    a.add(i)
    i <<= 1

N = int(input())
if N in a:
    print("True")
else:
    print("False")

我最初的想法是检查每个输入是否为2的幂,方法是从1开始乘以2直到超过输入数量,然后在每个步骤进行比较。相反,我set预先存储了2的所有幂,以便检查中的给定输入O(1)。如何改善呢?


问题答案:

将 _ 最好的,最准确_ 的方法是使用位操作:

(n & (n-1) == 0) and n != 0

说明:
2的每个幂将1位恰好设置为1(该数的对数以2为底的索引中的位)。因此,当从中减去1时,该位​​翻转为0,而所有在前位翻转为1。这使这2个数字互为逆,因此对它们进行“与”运算时,结果将为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将任何与进行AND运算都会得到0,因此我们添加的校验n != 0

您总是可以使用一些math函数,但是这些函数的准确性较差:

import math

math.log(n, 2).is_integer()

要么:

math.log2(n).is_integer()
  • 值得注意的是,对于任何n <= 0函数,两个函数都将抛出a,ValueError因为它在数学上是未定义的(因此不应出现逻辑问题)。

要么:

abs(math.frexp(n)[0]) == 0.5
  • 还应该指出的是,对于某些数字,这些功能不准确,实际上给出了 假结果

    • math.log(2**29, 2).is_integer() 会给 False
    • math.log2(2**49-1).is_integer() 会给 True
    • math.frexp(2**53+1)[0] == 0.5会给True

这是因为math函数使用浮点数,而这些浮点数具有固有的精度问题。

根据数学文档,log具有给定基数的,实际上会计算出log(x)/log(base)这显然很慢。log2据说更准确,甚至可能更有效。位操作是简单的操作,不调用任何函数。

结果是:

logbase=2:0.67秒

frexp:0.52秒

log2:0.37秒

位操作:0.2秒

我用于这些措施的代码可以在此REPL中重新创建。



 类似资料:
  • 我正在准备面试,遇到了这个问题: 编写一个程序,检查数字n是否为x^y形式。众所周知,n,x和y是整数,x和y大于2。 我想拿日志之类的东西,但不知道如何检查数字是否符合表格。你们谁能帮忙吗?:)

  • 问题内容: 我只是在Firefox的JavaScript控制台中尝试过,但是以下任何语句都不返回true: 问题答案: 试试这个代码:

  • 本文向大家介绍编写Golang程序以检查给定数字是否为质数,包括了编写Golang程序以检查给定数字是否为质数的使用技巧和注意事项,需要的朋友参考一下 定义: 一个数字是大于2且只能被其自身和1整除。 示例:素 数是2、3、5、7、11、13、113、119等。 解决这个问题的方法 步骤1:找到给定数字的平方根sq_root =√num 步骤2:如果给定数字可被[2,sq_root]所属的数字整除

  • 问题内容: 好吧,这是一个复杂的问题,我完全迷失了。 假设您有一个字符串和一个通用类。像这样。 您将如何检查String是否表示该类可以相等的值。 例如,可以这样说: 如何检查字符串“ true”实际上是布尔值? 这是另一个例子。可以这样说: 如何检查字符串“ true”不是整数? 问题答案: 鉴于您只需要 Wrapper Types ,可以在此处使用一些反射技巧(为简洁起见,忽略无关代码的异常处

  • 问题内容: 如何在Java中验证JSON字符串?还是可以使用正则表达式解析它? 问题答案: 一个疯狂的主意,尝试解析它并捕获异常: 该代码使用org.json JSON API实现,该实现在github,maven和部分Android上可用。

  • 问题内容: 检查字符串是否可以在Python中表示为数字的最佳方法是什么? 我目前拥有的功能是: 它不仅丑陋且缓慢,而且看起来笨拙。但是我还没有找到更好的方法,因为调用floatmain函数甚至更糟。 问题答案: 如果您要解析(正数,无符号)整数而不是浮点数,则可以将该isdigit()函数用于字符串对象。 字符串方法- isdigit():Python2,Python3