【问题标题】:Evaluate if integer is POT (Power Of Two) [duplicate]评估整数是否为 POT(二的幂)[重复]
【发布时间】:2011-03-05 07:43:27
【问题描述】:

可能的重复:
Query about working out whether number is a power of 2
How to check if a number is a power of 2

我需要这个原型的函数体:

bool isPOT(int x);

所以它会返回例如 isPOT(3) = FALSE,但 isPOT(8) = TRUE

什么是最漂亮/简洁的算法?什么是最有效的?

PS:我很惊讶我在 SO 上找不到这个问题,所以我完全期待有人能检测到一些重复。

PPS:有人可以创建 POT、NPOT、Power-Of-Two 标签吗?

【问题讨论】:

  • 是的,有很多重复项,例如Query about working out whether number is a power of 2
  • 为什么需要二次幂标签?!
  • 奇怪的是我在输入标题时没有看到匹配项,我想可能是因为我使用了 'two' 而不是 '2'
  • @user470379:对于底层工作/优化(尤其是图形)POT和NPOT是常用的缩写

标签: c algorithm bit-manipulation


【解决方案1】:
bool IsPOT(int x)
{
    return (x > 0) && ((x & (x - 1)) == 0);
}

【讨论】:

  • 有人可能想以宏形式重写它,以便它适用于任何类型的整数 #define ISPOW2(x) ( (x)>0 && !( (x) & ((x) - 1) ) )
  • @datenwolf:除了你会遇到所有常见的宏问题 - 最好保留一个 int 函数,它将处理 char、short 和 int,然后如果你做一个附加版本需要处理比 int 更宽的任何东西。
【解决方案2】:

不确定这个确切问题是否发生,但检查很容易

x & (x - 1) == 0

【讨论】:

  • 几乎——你还需要检查x > 0,否则x = 0时你会得到不正确的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多