2020-5-8
今天茶足飯飽之余,在知乎上看到了一篇文章《記一道簡(jiǎn)單的java面試題》 。
題目為:實(shí)現(xiàn)一個(gè)方法,判斷一個(gè)整數(shù)是否為奇數(shù)。
應(yīng)試者的第一段代碼:
public boolean isOdd(int i) {
if (i % 2 == 1) {
return true;
} else {
return false;
}
}
如果應(yīng)試者真的寫出這樣的代碼,我想應(yīng)該基本就掛掉了吧。這段代碼的問題是應(yīng)試者沒有考慮到輸入的整數(shù)為負(fù)數(shù)的情況。例如當(dāng)輸入值為-1,這段代碼返回的結(jié)果為false,另外既然返回值為布爾類型,就不需要多余的if...else判斷語句。代碼進(jìn)而可以優(yōu)化為:
public boolean isOdd(int i) {
return i % 2 != 0;
}
這樣一來,既增加了可讀性,也使代碼具有魯棒性。
有沒有更好的方法呢?或者說是否可以不通過取模的方式來完成這個(gè)函數(shù)
奇偶的區(qū)別在于最后一位是1還是0,我們只需要位運(yùn)算操作,就可以將代碼簡(jiǎn)化至:
public boolean isOdd(int i) {
return (i & 1) == 1;
}
最后,在本篇文章中作者指出:
我:“這樣是不是比上面取模運(yùn)算要快?”
候選人:“那當(dāng)然了,位運(yùn)算肯定快啊。”
我:“但是我們實(shí)際代碼測(cè)試過,發(fā)現(xiàn)上面的按位與操作和取模操作,實(shí)際運(yùn)行的時(shí)間是差不多的,為什么呢?”
作者給出的解釋:

這其實(shí)也解決了我一直以來的疑惑~