3 回答

TA貢獻1802條經(jīng)驗 獲得超5個贊
使用modulo(%)運算符檢查除以2時是否有余數(shù):
if (x % 2) { /* x is odd */ }
有幾個人批評我上面的回答說明使用x&1是“更快”或“更有效”。我不相信這是事實。
出于好奇,我創(chuàng)建了兩個簡單的測試用例程序:
/* modulo.c */
#include <stdio.h>
int main(void)
{
int x;
for (x = 0; x < 10; x++)
if (x % 2)
printf("%d is odd\n", x);
return 0;
}
/* and.c */
#include <stdio.h>
int main(void)
{
int x;
for (x = 0; x < 10; x++)
if (x & 1)
printf("%d is odd\n", x);
return 0;
}
然后我用gcc 4.1.3在我的一臺機器上編譯了5次不同的時間:
沒有優(yōu)化標(biāo)志。
用-O
隨著-Os
用-O2
使用-O3
我檢查了每個編譯的匯編輸出(使用gcc -S),發(fā)現(xiàn)在每種情況下,and.c和modulo.c的輸出都是相同的(它們都使用了andl $ 1,%eax指令)。我懷疑這是一個“新”功能,我懷疑它可以追溯到古代版本。我也懷疑任何現(xiàn)代(在過去20年制造)非神秘的編譯器,商業(yè)或開源,缺乏這樣的優(yōu)化。我會測試其他編譯器,但目前我還沒有。
如果其他人愿意測試其他編譯器和/或平臺目標(biāo),并得到不同的結(jié)果,我會非常有興趣知道。
最后,無論實現(xiàn)的有符號整數(shù)的表示如何,標(biāo)準(zhǔn)都保證模數(shù)版本能夠工作,無論整數(shù)是正數(shù),負數(shù)還是零。按位和版本不是。是的,我意識到兩個補碼有點無處不在,所以這不是一個真正的問題。

TA貢獻1876條經(jīng)驗 獲得超5個贊
你們是waaaaaaaay太高效了。你真正想要的是:
public boolean isOdd(int num) {
int i = 0;
boolean odd = false;
while (i != num) {
odd = !odd;
i = i + 1;
}
return odd;
}
重復(fù)一遍isEven。
當(dāng)然,這對負數(shù)不起作用。但憑借輝煌而犧牲......

TA貢獻1818條經(jīng)驗 獲得超8個贊
使用位算術(shù):
if((x & 1) == 0)
printf("EVEN!\n");
else
printf("ODD!\n");
這比使用除法或模數(shù)更快。
- 3 回答
- 0 關(guān)注
- 510 瀏覽
添加回答
舉報