日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

谜题1:奇数性

發布時間:2023/12/15 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 谜题1:奇数性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面的方法意圖確定它那唯一的參數是否是一個奇數。這個方法能夠正確運轉嗎?


public static boolean isOdd(int i){

    return i % 2 == 1;

}

奇數可以被定義為被2整除余數為1的整數。表達式 i % 2 計算的是 i 整除 2 時所產生的余數,因此看起來這個程序應該能夠正確運轉。遺憾的是,它不能;它在四分之一的時間里返回的都是錯誤的答案。

為什么是四分之一?因為在所有的 int 數值中,有一半都是負數,而 isOdd 方法對于對所有負奇數的判斷都會失敗。在任何負整數上調用該方法都回返回 false ,不管該整數是偶數還是奇數。

這是 Java 對取余操作符(%)的定義所產生的后果。該操作符被定義為對于所有的 int 數值 a 和所有的非零 int 數值 b,都滿足下面的恒等式:


(a / b) * b + (a % b) == a

換句話說,如果你用b整除a,將商乘以b,然后加上余數,那么你就得到了最初的值 a 。該恒等式具有正確的含義,但是當與 Java 的截尾整數整除操作符相結合時,它就意味著:當取余操作返回一個非零的結果時,它與左操作數具有相同的正負符號。

當 i 是一個負奇數時,i % 2 等于-1而不是1, 因此 isOdd 方法將錯誤地返回false。為了防止這種意外,請測試你的方法在為每一個數值型參數傳遞負數、零和正數數值時,其行為是否正確。

這個問題很容易訂正。只需將 i % 2 與0而不是與1比較,并且反轉比較的含義即可:


public static boolean isOdd(int i){

    return i % 2 != 0;

}

如果你正在在一個性能臨界(performance-critical)環境中使用isOdd方法,那么用位操作符AND(&)來替代取余操作符會顯得更好:


public static boolean isOdd(int i){

    return (i & 1) != 0;

}

總之,無論你何時使用到了取余操作符,都要考慮到操作數和結果的符號。該操作符的行為在其操作數非負時是一目了然的,但是當一個或兩個操作數都是負數時,它的行為就不那么顯而易見了。

總結

以上是生活随笔為你收集整理的谜题1:奇数性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。