關於負數求模運算

2021-06-11 21:28:56 字數 551 閱讀 2694

當我們遇到-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...