取模運(yùn)算理解

取模運(yùn)算

背景

取模運(yùn)算(mod)和取余運(yùn)算(rem)兩個(gè)概念有重疊的部分,但又不完全一致;主要區(qū)別在于對(duì)負(fù)整數(shù)進(jìn)行除法運(yùn)算時(shí)操作不同。取模主要是用于計(jì)算機(jī)術(shù)語中;取余則更多是數(shù)學(xué)概念。

取模和取余的區(qū)別

  • 取余運(yùn)算 在計(jì)算商值時(shí) 商值向0方向舍入;靠近0原則
  • 取模運(yùn)算 在計(jì)算商值時(shí) 商值向負(fù)無窮方向舍入;盡可能讓商值小的原則(不超多商值的最大值)

計(jì)算步驟

假設(shè)有整數(shù)a和b,那么取模/取余運(yùn)算可以分為兩步運(yùn)算:

  1. 求整數(shù)商:c = a/b;
  2. 計(jì)算模/余數(shù):r = a - (c*b);
  3. 總計(jì)算模/余數(shù):a mod b = a - b[a/b] ([a/b]表示整數(shù)商)

例子

取模

簡(jiǎn)述 商值 取模值
5 mod 3 = 2 5/3 = 1.66 商取小原則 商=1 5 - 3 * 1 = 2 2
-5 mod 3 = 1 -5/3 = -1.66 商取小原則 商=-2 -5 - (3 * -2) = 1 1
5 mod -3 = -1 5/-3 = -1.66 商取小原則 商=-2 5 - (-3 * -2) = -1 -1
-5 mod -3 = -2 -5/-3 = 1.66 商取小原則 商=1 -5 - (-3 * 1) = 2 -2

取余

簡(jiǎn)述 商值 取余值
5 rem 3 = 2 5/3 = 1.66 商靠0原則 商=1 5 - 3 * 1 = 2 2
-5 rem 3 = -2 -5/3 = -1.66 商靠0原則 商=-1 -5 - (3 * -1) = - 2 -2
5 rem -3 = 2 5/-3 = -1.66 商靠0原則 商=-1 5 - (-3 * -1) = 2 2
-5 rem -3 = -2 -5/-3 = 1.66 商靠0原則 商=1 -5 - (-3 * 1) = - 2 -2

java 中 % 是取余運(yùn)算;Python中 % 是取模運(yùn)算

模的理解

“?!笔侵敢粋€(gè)計(jì)量系統(tǒng)的計(jì)數(shù)范圍;如時(shí)鐘,12個(gè)整點(diǎn)為計(jì)算范圍,則模為12;計(jì)算機(jī)也是一個(gè)計(jì)量機(jī)器,模為32位或者64位;

32位計(jì)算機(jī)正常理解 在模 范圍內(nèi)能表達(dá)的 有 [0, 232-1];那么負(fù)數(shù)該怎么表達(dá)呢,所以出現(xiàn)了補(bǔ)碼;也就是 正數(shù) + 負(fù)數(shù) 正好達(dá)到模的溢出閥值232;所以在計(jì)算機(jī)中負(fù)數(shù)是用補(bǔ)碼方式表達(dá)的原因;

關(guān)于補(bǔ)碼的例子:在12模的時(shí)鐘中;假設(shè)當(dāng)前時(shí)針指向10點(diǎn),而準(zhǔn)確時(shí)間是6點(diǎn),調(diào)整時(shí)間可有以下兩種撥法

  1. 倒撥4小時(shí),即:10-4=6 (10-4) mod 12 = 6
  2. 順撥8小時(shí):10+8=12+6=6 (10+8)mod 12 = 6

在以12模的系統(tǒng)中,加8和減4效果是一樣的;因此凡是減4運(yùn)算,都可以用加8來代替。對(duì)“?!倍裕?和4互為補(bǔ)數(shù)。實(shí)際上以12模的系統(tǒng)中11和1、10和2、9和3、7和5、6和6都有這個(gè)特性;共同的特點(diǎn)是兩者相加等于模

“取?!睂?shí)質(zhì)上是計(jì)量器產(chǎn)生“溢出”的量,它的值在計(jì)量器上表示不出來,計(jì)量器上只能表示出模的余數(shù)(取模);任何有模的計(jì)量器,均可化為加減法運(yùn)算

5 mod 3 = 2 例子中;模 為 3;2 為取模的值

計(jì)算機(jī)中取模應(yīng)用思想

取模的本質(zhì)是:取模的值,必定會(huì)模的范圍內(nèi);所以,計(jì)算機(jī)領(lǐng)域引用該特性,使元素路由算法不超出邊界,并有規(guī)則存放。

首先確定模(范圍);元素取模,使元素有規(guī)則的落入模的范圍內(nèi)容器中

如:hashMap、數(shù)據(jù)庫分表、分布式節(jié)點(diǎn)路由算法等

參考文檔:<原碼, 反碼, 補(bǔ)碼 詳解>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容