取模運(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)算:
- 求整數(shù)商:c = a/b;
- 計(jì)算模/余數(shù):r = a - (c*b);
- 總計(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í)間可有以下兩種撥法
- 倒撥4小時(shí),即:10-4=6 (10-4) mod 12 = 6
- 順撥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ǔ)碼 詳解>