我制作了以下代码,但它无效。编译器会针对缺少的)
和表达式语法错误提供错误。运营商的流程是什么?从左到右还是从右到左?
#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;
}
答案 0 :(得分:24)
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
的最后一部分是非法的。
答案 1 :(得分:8)
我不打算直接回答,但是我会注意到,当你从一个数字中减去一个时,2的幂只有一个位,和,它会清除最低有效位设置,并设置所有不太重要的位。看看其中一个事实然后另一个可能会想出如何在一行中检测第一个条件。
答案 2 :(得分:5)
就个人而言,我更喜欢这种味道:
bool isPow2 = ((x & ~(x-1))==x)? x : 0;
它依赖于相同的二进制数学运算,但它以更微妙的方式处理零的情况不是2的幂。
答案 3 :(得分:1)
使用逗号运算符,从左到右计算表达式,因此永远不会执行`if(flag)printf(“YES”)。
我很好奇这是什么意思,因为(val != 0) && ((val & val-1) == 0)
如果值是2的幂,则返回非零值。