[英]Testing oddity of an integer with the modulo operator
以下代碼段不能正確測試奇怪性:
public static boolean isOdd(int i) {
return i % 2 == 1;
}
我在網上看到我應該通過以下方式做到:
public static boolean isOdd(int i) {
return i % 2 != 0;
}
為什么是這樣?
可能因為(i % 2) != 0
適用於正數和負數
因為當i
是負數 - > (-1) % 2 == -1
你應該使用:
(i & 1) != 0
避免簽署問題。
另請注意,使用&
確保編譯器無論多么愚蠢,它都不會嘗試使用除法來實現%
操作。
如果將模運算符替換為按位運算符,則第一個代碼段將正常工作:
public static boolean isOdd(int i) {
return (i & 1) == 1;
}
這與modulo在Java中的工作方式有關。 如果我是否定的,答案也將是否定的。 每個負面輸入都將返回false。
因為下面的方法在為每個數值參數傳遞負值,零值和正值時表現正常。
public static boolean isOdd(int i) {
return i % 2 != 0;
}
如果我們使用上面的方法isOdd()
性能不會太好,那么使用按位AND operator(&)
代替remainder(%)
運算符會更好。
public static boolean isOdd(int i) {
return (i & 1) != 0;
}
此代碼首先運行得更快,具體取決於我們使用的平台和虛擬機。
注意: - 作為一般規則,與其他算術和邏輯運算符相比,除法和余數運算符較慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.