當我們遇到-2%3的時候,怎麼運算呢?通常乙個數m mod n ,可以將m表示為 k*n + r ,其中0<=r<=n-1就是餘數,也是求模的結果。當m為負數的時候,這時候有兩種方法:
(1)先將負號提出去,直接求|m|%n,之後加上負號,最後還要加上n,就是最終結果了;
例如:-5 % 3
-( 5 % 3 ) = -2
-2 + 3 = 1
即-5 % 3 = 1.
(2)按照定義,將m = k*n + r 為使得r為0~(n-1),此時k一定為負數。即k = -ceil ( m / n ),注:ceil向上取整
例如:-5 % 3
-ceil( 5 / 3 ) = - 2
-5 = -2*3 + 1
即-5 % 3 = 1.
在計算機中,例如在vc6.0編譯環境下,-5%3 就是 -2,所以最後還是要加上3的。一般的,vc6.0中m%n的值它的負號是由m決定的。在c++primer書p130中,明確說明:"兩個正數求模結果為正;兩個負數求模結果為負;若一正一負,求模結果取決於機器,求模的負號也由機器決定。" 。
關於負數與位運算
劍指offer上的一道原題,鑽了個牛角尖 求二進位制中1的個數 問題出現在負數,因為要保持負數的性質,所以對負數進行右移操作後將在首位重新補1,若干次右移後將變為0xffffffff.如果要去掉負數的符號位,可以考慮用 int a 127 a a 0x80000000 0x80000000就是32位...
關於求模與求餘
我覺得很多人搞不清楚這兩個概念的區別,剛好在翻譯lua手冊時遇到 與math.fmod這兩個操作,順便做一下說明吧。求模與求餘的區別。假設對a與b兩個 整數做求模或求餘操作。那麼第一步是先求整數商c,即 a b 的值,第二步是計算模或餘數 a c b 求模與求餘的區別在於怎麼處理 a b 的值。求模...
求模運算( )和按位與運算( )
最近看了看hashmap原始碼,覺得裡面的乙個按位與運算用的很優雅,記錄一下。jdk7中,hashmap是 陣列 鍊錶 的結構,為了讓hashmap裡的元素分布的更加均勻,就要在陣列中給每個元素乙個合適的位置,求模運算是乙個不錯的方法,但是,jdk7中使用了一種更加優雅的方法,原始碼中的方法如下 s...