避免IF ELSE分支

时间:2014-02-26 16:09:06

标签: c branch-prediction

我正在考虑分支,我想避免在循环中进行分支,这基本上就是这样做

for(z=0; z<8; z++){
   if(0xff&&(array[z])!=0 ){
       break;
   }
 }

所以我的计划实际上是用以下内容替换它:

for(z=0; z<8; z++){
     (0xff&&(array[z])==0 ) ? continue :  break;
}

但是,这不起作用,我理解为什么,但想知道是否有其他方式这样做,以类似的方式。

谢谢

5 个答案:

答案 0 :(得分:2)

您可以将中断条件包含在for语句的终止条件(即z <8)中。但你无法避免分支;这只是表达它的一种不同方式。

答案 1 :(得分:0)

使用?仍然是一个分支,它只是写if的另一种方式。 因为你只有8个指标,你可以展开你的循环。

inline int getZ() { if (array[0] & 0xff) return 0; if (array[1] & 0xff) return 1; ... and so on }

作为旁注,您希望使用&按位运算符,而不是布尔&&运算符,否则您的表达式将始终为true。

答案 2 :(得分:0)

怎么样:

int bits = 0;
for(z=0; z<8; z++) bits |= array[z];
if ((bits & 0xff) != 0) printf("Found it!\n");

上面只有一个额外的if,而不是每个循环迭代一次。如果您的目标是使代码的执行速度更快,那么它可能会有所帮助,也可能不会。 (我的猜测是,如果你在现代CPU上运行,它不会产生太大的影响)

答案 3 :(得分:0)

int z = 0;
while(z<8 && (0xff&&array[z]==0)) z++;

注意:也许你打算用0xff掩盖数组[z]? (即使用按位&amp;运算符?)

答案 4 :(得分:0)

你对表达的否定是错误的。

0xff&&(array[z])!=0true(始终为真)且0xfftrue时,

(array[z])!=0true

因此,0xff&&(array[z])!=0评估为(array[z])!=0,否定提供(array[z]==0)

因此您需要将(0xff&&(array[z])==0 ) ? continue : break;修改为(array[z]==0) ? continue : break;