【问题标题】:Check the Number of Powers of 2检查 2 的幂数
【发布时间】:2021-08-13 03:37:56
【问题描述】:

我有一个数字 X ,我想检查它的 2 的幂数? 防爆

N=7  ans is 2 , 2*2
N=20 ans is 4, 2*2*2*2

类似的我想查看next power of 2

For Ex:
N=14 Ans=16

在不使用for 循环的情况下是否有任何Bit Hack? 就像我们有一个单行解决方案来检查它是否是 2 X&(X-1)==0 的幂,类似吗?

【问题讨论】:

标签: algorithm math bit


【解决方案1】:

GCC 有一个名为__builtin_clz() 的内置指令,它返回整数中前导零的数量。例如,假设一个 32 位的 int,表达式 p = 32 - __builtin_clz(n) 将告诉您存储整数 n 需要多少位,而 1 << p 将给出 2 的下一个最高幂(假设 @ 987654327@

还有与longlong long 整数一起使用的等效函数。

另外,math.h 定义了一个名为 frexp() 的函数,它返回双精度数的以 2 为底的指数。这可能效率较低,因为在将整数传递给此函数之前,必须将其转换为双精度值。

【讨论】:

    【解决方案2】:

    如果一个数字在其二进制值中只有一个“1”,则它是 2 的幂。例如,2 = 00000010、4 = 00000100、8 = 00001000 等等。因此,您可以使用计数来检查它。 1 的位值。如果 count 为 1,则该数字为 2 的幂,反之亦然。

    您可以从 herehere 获得帮助,以避免用于计算设置位的 for 循环。

    如果 count 不是 1(意味着 Value 不是 2 的幂),则从 MSB 获取其第一个设置位的位置,并且该数字的下一个 2 的幂值是仅在位置 + 1 处设置位的值。例如,数字 3 = 00000011。它从 MSB 开始的第一个设置位是第 2 位。因此,2 的下一个幂是仅在第 3 位设置位的值。即 00000100 = 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多