【问题标题】:Determine if an int is a power of 2 or not in a single line [duplicate]确定一个 int 是否是 2 的幂在一行中[重复]
【发布时间】:2010-09-03 18:12:48
【问题描述】:

可能重复:
How to check if a number is a power of 2

我编写了以下代码,但它不起作用。编译器给出了一个错误,即缺少 ) 和表达式语法错误。运营商的流程是怎样的?从左到右还是从右到左?

#include <stdio.h>
#include <limits.h>
#include <math.h>
int main()
{
    int i, x = 256, y, flag;
    for (i = 0, flag = 0, y = 1; y<INT_MAX; if (flag) break, if (flag) printf("YES"), if(y == x) flag = 1, i++, y = pow(2,i));
    return 0;
}

【问题讨论】:

  • Eww。可恶的。惭愧。
  • @fahad:你显然没有阅读我链接的问题和答案。
  • @fahad:如果您不将其包装在函数中,则对该链接的最高投票答案在一行中有效。 “行”也不是 c 代码的基本单元:只需省略换行符,预处理器指令之间的所有内容都适合“一行”。
  • @james,提供的链接是一个很好的解决方案,并不是说我有机会阅读和理解它。很好的发现:)

标签: c for-loop


【解决方案1】:
 bool ispowerof2(unsigned int x) {
   return x && !(x & (x - 1));
 }

请注意,2 的幂的位模式是 10...0 的形式,而仅小一的数字的位模式是 011...1。

就您的代码而言:

for( i=0, flag=0, y=1;
     y<INT_MAX;      
     if(flag)break,if(flag)printf("YES"),if(y==x)flag=1,i++,y=pow(2,i)
   );

for 的最后一部分是非法的。

【讨论】:

  • 既然他用的是ints,那用它们不是更好吗(跳过0的特殊情况)?
  • @James:这将是一种隐式转换。我看没有坏处。但是为什么要跳过特殊情况呢?
  • @james:我的代码中没有发现任何非法内容。我遵守了所有规则。
  • @dirk:因为 (0 & -1)==0。仅在 x-1 中需要的特殊情况是非法的。
  • @James Curran:您误解了特殊情况。 (0 &amp; -1) == 0 肯定是真的,但由于 0 不是 2 的幂,在这种情况下不应返回“真”。无论您使用无符号值还是有符号值都是如此(x-1 与无符号 x == 0 是完全合法的)。
【解决方案2】:

我不打算直接回答,但我会注意,2 的幂只设置了一个位,并且当你从一个数字中减去一个时,它会清除最低有效位已设置,并设置所有较低有效位。查看其中一个事实,然后查看另一个事实可能会了解如何检测一行中的第一个条件。

【讨论】:

  • 你是说it clears the most significant bit that's set
  • @CholthiPaulTtiopic:不。它会清除当前设置的最低有效位。所以给定(例如)0111000,当前设置的最低有效位是位 3。如果我们减去 1,位 3 将被清除,位 0 到 2 将被设置(并且所有高位保持不变),给0110111
【解决方案3】:

就个人而言,我更喜欢这种味道:

bool isPow2 = ((x & ~(x-1))==x)? x : 0;

它依赖于相同的二进制数学,但它以更微妙的方式处理 0 不是 2 的幂的情况。

【讨论】:

    【解决方案4】:

    使用逗号运算符,表达式是从左到右计算的,所以你的 `if(flag)printf("YES") 永远不会被执行。

    我很好奇这是什么意思,因为如果值是 2 的幂,(val != 0) &amp;&amp; ((val &amp; val-1) == 0) 返回非零值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2010-09-11
      • 2017-02-19
      • 1970-01-01
      • 2015-10-12
      相关资源
      最近更新 更多