【问题标题】:Is there any faster way to check if a number is a integral power of 2 in c++ [duplicate]有没有更快的方法来检查一个数字是否是 C++ 中 2 的整数幂 [重复]
【发布时间】:2015-08-10 16:15:49
【问题描述】:

这个方法我知道,效率不够

(a/2)%2==0;

【问题讨论】:

  • 根据 a 的大小 - 您可以进行单个位比较,检查值 2、4、8、16、32、64 等。
  • 除法和取模,已经很高效了!您是否进行了基准测试并确定这是一个瓶颈?
  • (12 / 2) % 2 = 0。 12 不是 2 的整数次幂。
  • 实际上我在竞争性编程问题中超过了时间限制
  • @g.ijoe 是因为某处有循环吗?

标签: c++


【解决方案1】:

Bit Twiddling Hacks

unsigned int v; // we want to see if v is a power of 2
bool f;         // the result goes here 

f = (v & (v - 1)) == 0;

请注意,此处将 0 错误地视为 2 的幂。要解决此问题,请使用:

f = v && !(v & (v - 1));

【讨论】:

    【解决方案2】:

    你的方法没有检查。例如,它将返回 12 的 true。(并且将返回 2 的 false)

    要检查你可以使用x != 0 && (x & (x - 1)) == 0

    【讨论】:

    • 嘿......我们想出了同样的例子......
    • @EugenSh。它是 4 的最小倍数,不是 2 的幂,所以很自然
    【解决方案3】:

    如果您使用 gcc 和 x64,则有一个内在函数可以让您使用 CPU 指令来计算位:

    int __builtin_popcount (unsigned int x)
    

    【讨论】:

    • 如何使用人口计数来确定一个数字是否是 2 的幂?
    • @DarkDust 值是 2 的幂,只有一位设置
    • 对。很明显它很痛……
    猜你喜欢
    • 2013-07-08
    • 2015-10-12
    • 2020-09-18
    • 2021-04-27
    • 2010-10-10
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多