在一行中确定int是否为2的幂

fud*_*din 5 c for-loop

可能重复:
如何检查数字是否为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;
}
Run Code Online (Sandbox Code Playgroud)

dir*_*tly 25

 bool ispowerof2(unsigned int x) {
   return x && !(x & (x - 1));
 }
Run Code Online (Sandbox Code Playgroud)

注意,2的幂的位模式是10 ... 0的形式,而仅少于1的数的位模式是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)
   );
Run Code Online (Sandbox Code Playgroud)

最后一部分for是非法的.


Jer*_*fin 8

我不会直接回答,但我会注意,两个功率只有一个位设置,并且当你从一个数中减去一个,它会清除某个设定最低显著位,并将所有的少显著位.看看其中一个事实然后另一个可能会想出如何在一行中检测第一个条件.


abe*_*nky 5

我个人更喜欢这种味道:

bool isPow2 = ((x & ~(x-1))==x)? x : 0;
Run Code Online (Sandbox Code Playgroud)

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