簡體   English   中英

使用模運算符測試整數的奇怪性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM