2014-02-26 84 views
0

我看着分支,我想,以避免在一個循環,基本上在做這個避免的if else分支

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

所以我的計劃實際上是分支具有以下取代它:

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

但是,這不起作用,我理解爲什麼,但想知道是否有另一種方式來做到這一點,以類似的方式。

感謝

+2

你的「計劃」是利用分支;它只是用一種不同的語法來表達它。 –

+0

除了原因不起作用外,條件運算符也是一個分支,所以無論如何你都不會達到目標。 – delnan

+0

你想達到什麼目的?爲什麼你想避免循環中的分支? (附加說明:'0xff && array [z]!= 0'相當於'array [z]!= 0') –

回答

2

你可以包括與for語句的終止條件(即Z^< 8)斷點條件。但是你不能避免分支;這只是表達它的一種不同的方式。

0

使用?仍然是一個分支,它只是另一種編寫if的方法。 由於您只有8個標記,您可以展開您的循環。

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

作爲一個側面說明,你要使用的&位運算符,而不是布爾&&操作,否則你的表現將永遠是正確的。

+0

我將循環展開到編譯器,直到遇到(1)編譯器未展開和(2)它有所作爲的證據。 – delnan

+0

@delnan我們都不知道,但至少它給了提問者一個嘗試的選擇。例如,如果他正在研究一個小型微控制器,這可能會產生非常大的差異。 – MrZebra

+0

OP甚至無法獲得他們的代碼進行編譯,更不用說正確運行。這應該優先考慮,你不覺得嗎? ;-)我一般不反對教授優化技巧,但我可以想到幾十個認爲可能比OP更有益於OP(包括其他微型優化,因爲編譯器已經做到了這些而不太可能毫無意義的優化)。 – delnan

0

如何:

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

上面只有一個額外的if,而不是一個每循環迭代。如果你的目標是讓代碼的執行速度更快,它可能會有所幫助,或者可能不會。 (我的猜測是,如果你是一個現代的CPU上運行它不會使一個很大的區別)

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

注:也許你的意思是掩蓋陣列[Z]用0xff? (即使用按位運算符&?)

+0

是的,我做了,我的錯誤:) – Anoracx

0

你對錶達式的否定是錯誤的。

0xff&&(array[z])!=0true0xfftrue(這是總是如此)和(array[z])!=0true

所以0xff&&(array[z])!=0計算爲(array[z])!=0其上的否定給出(array[z]==0)

所以,你需要修改(0xff&&(array[z])==0) ? continue : break;(array[z]==0) ? continue : break;

+0

你沒有錯,但是這個工作可以通過刪除無意義的連接w/TRUE或者修改錯誤地使用&&代替'&'來減少。 – delnan

+0

_fixing錯誤地使用&&代替&_是什麼意思? –

+0

條件應該涉及'0xff&array [z]',而不是'0xff && array [z]'。後者是沒有意義的,並且OP [已經聲明前者是意圖](http://stackoverflow.com/questions/22046899/avoid-if-else-branching/22047240?noredirect=1#comment33428001_22047089)。 – delnan