假設要寫一個算學生成績的程式:
100~91 : A
90 ~81 : B
80 ~71 : C
...
10 ~ 0 : J
首先,就編譯器的眼光來看,我猜用十個 if 來寫應該是非常快的了。當然,要改成 if elseif 來寫當然會更有效率一點。這邊是指類似:
if (G <= 100 && G >= 91) g = 'A';
...
else if (G<= 10 && G>=0) g = 'J';
改成:
if (G >= 91) g = 'A';
else if (G >= 81) g = 'B';
...
else if (G >= 11) g = 'I';
else g = 'J';
上面假設成績最高 100, 最低 0
然而若要照原來那個朋友要的,改成 switch 的話,基本上,是可以做到,但是即使經過轉換改成 switch, 以編譯器的眼光來看,switch 是較慢的,最佳化也是類似上面的寫法。
不過底下提供另一個寫法,不保證較快,但是需要點腦袋來思考:
g = 9 - (int)((G-1)/10) + 65;
或
g = 74 - (int)((G-1)/10);
一個整數除法與兩個減法。或許可以跟 if 比效率吧!
另外,還有一個寫法,若純粹想要讓人頭昏的話還不錯用:
g = (110-G)/10 | 0x40;
這個的演化來自於 74 - x == 64 + (10-x) == (10-x) | 0x40
最後的答案是把 10 搬到分子,整數除法跟浮點除法不一樣,整數除法要看成「一段範圍」的除法取整數,因此搬到分子的時候是 109 而非 100, 這一點留給看官花點時間想想。
0 意見:
張貼留言