Golang进位计数制(进制)
進(jìn)制
進(jìn)制也就是進(jìn)位計(jì)數(shù)制,是人為定義的帶進(jìn)位的計(jì)數(shù)方法(有不帶進(jìn)位的計(jì)數(shù)方法,比如原始的結(jié)繩計(jì)數(shù)法,唱票時(shí)常用的“正”字計(jì)數(shù)法,以及類似的tally mark計(jì)數(shù))。 對(duì)于任何一種進(jìn)制---X進(jìn)制,就表示每一位置上的數(shù)運(yùn)算時(shí)都是逢X進(jìn)一位。 十進(jìn)制是逢十進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一,以此類推,x進(jìn)制就是逢x進(jìn)位。
現(xiàn)代的電子計(jì)算機(jī)技術(shù)全部采用的是二進(jìn)制,因?yàn)樗皇褂?、1兩個(gè)數(shù)字符號(hào),非常簡(jiǎn)單方便,易于用電子方式實(shí)現(xiàn)。計(jì)算機(jī)內(nèi)部處理的信息,都是采用二進(jìn)制數(shù)來(lái)表示的。二進(jìn)制(Binary)數(shù)用0和1兩個(gè)數(shù)字及其組合來(lái)表示任何數(shù)。進(jìn)位規(guī)則是“逢2進(jìn)1”,數(shù)字1在同的位上表示不同的值,按從右至左的次序,這個(gè)值以二倍遞增。
在計(jì)算機(jī)的內(nèi)部,運(yùn)行各種運(yùn)算時(shí),都是以二進(jìn)制的方式來(lái)運(yùn)行的。
對(duì)于整數(shù),常用的進(jìn)制有二進(jìn)制、八進(jìn)制、十進(jìn)制以及十六進(jìn)制
二進(jìn)制: 0, 1,滿2進(jìn)1
八進(jìn)制: 0 - 7,滿8進(jìn)1,計(jì)算機(jī)內(nèi)以0開(kāi)頭表示
十進(jìn)制:0 - 9, 滿10進(jìn)1
十六進(jìn)制: 0-9及A-F,滿16進(jìn)1,計(jì)算機(jī)內(nèi)以0x或者0X開(kāi)頭表示。此處的A-F不區(qū)分大小寫(xiě),如0x21AF+1 = 0X21B0
不同進(jìn)制的對(duì)比
| 十進(jìn)制 | 十六進(jìn)制 | 八進(jìn)制 | 二進(jìn)制 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 10 |
| 3 | 3 | 3 | 11 |
| 4 | 4 | 4 | 100 |
| 5 | 5 | 5 | 101 |
| 6 | 6 | 6 | 110 |
| 7 | 7 | 7 | 111 |
| 8 | 8 | 10 | 1000 |
進(jìn)制轉(zhuǎn)換
其他進(jìn)制轉(zhuǎn)十進(jìn)制
規(guī)則:從最低位開(kāi)始(右邊的),將每個(gè)位上的數(shù)提取出來(lái),乘以2的(位數(shù)-1)次方,然后求和。
二進(jìn)制轉(zhuǎn)十進(jìn)制
1011 = 1 * 23+0 * 2 2+1 * 2 1+1 * 20 = 8 + 2 + 1 = 11
八進(jìn)制轉(zhuǎn)十進(jìn)制
01011 = 1 * 83 + 0 * 82 + 1 * 81 + 1 * 80 = 521
十六進(jìn)制轉(zhuǎn)十進(jìn)制
0x1011 = 1 * 163 + 0 * 162 + 1 * 161 + 1 * 160 = 4113
十進(jìn)制轉(zhuǎn)其他進(jìn)制
十進(jìn)制轉(zhuǎn)二進(jìn)制
規(guī)則:將該數(shù)不斷除以2,直到商為0為止,然后將每步得到的余數(shù)倒過(guò)來(lái),就是對(duì)應(yīng)的二進(jìn)制。
十進(jìn)制轉(zhuǎn)八進(jìn)制
規(guī)則:將該數(shù)不斷除以8,直到商為0為止,然后將每步得到的余數(shù)倒過(guò)來(lái),就是對(duì)應(yīng)的八進(jìn)制。
十進(jìn)制轉(zhuǎn)十六進(jìn)制
規(guī)則:將該數(shù)不斷除以16,直到商為0為止,然后將每步得到的余數(shù)倒過(guò)來(lái),就是對(duì)應(yīng)的十六進(jìn)制。
二進(jìn)制轉(zhuǎn)其他進(jìn)制
二進(jìn)制轉(zhuǎn)八進(jìn)制
規(guī)則:將二進(jìn)制數(shù)每三位一組(從低位開(kāi)始組合),轉(zhuǎn)成對(duì)應(yīng)的八進(jìn)制數(shù)即可。
11010101 => (11)(010)(101) => 0325
二進(jìn)制轉(zhuǎn)十六進(jìn)制
規(guī)則:將二進(jìn)制數(shù)每三位一組(從低位開(kāi)始組合),轉(zhuǎn)成對(duì)應(yīng)的八進(jìn)制數(shù)即可。
11010101 => (1101)(0101) =>0xD5
其他進(jìn)制轉(zhuǎn)二進(jìn)制
八進(jìn)制轉(zhuǎn)二進(jìn)制
規(guī)則:將八進(jìn)制的每1位,轉(zhuǎn)成對(duì)應(yīng)的一個(gè)三位的二進(jìn)制數(shù)即可。
0237 => (010)(011)(111) => 10011111
十六進(jìn)制轉(zhuǎn)二進(jìn)制
規(guī)則:將八進(jìn)制的每1位,轉(zhuǎn)成對(duì)應(yīng)的一個(gè)四位的二進(jìn)制數(shù)即可。
0x237 => (0010)(0011)(0111) => 1000110111
原碼、反碼、補(bǔ)碼
在計(jì)算機(jī)內(nèi),定點(diǎn)數(shù)分為有符號(hào)數(shù)(signed)和無(wú)符號(hào)數(shù)(unsigned)。其中,有符號(hào)數(shù)的表示方法有三種:原碼、反碼和補(bǔ)碼。
在計(jì)算機(jī)運(yùn)算的時(shí)候,都是以補(bǔ)碼的方式進(jìn)行運(yùn)算的。
三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”,而數(shù)值位,三種表示方法各不相同。
原碼
原碼(true form)是一種計(jì)算機(jī)中對(duì)數(shù)字的二進(jìn)制定點(diǎn)表示方法。原碼表示法在數(shù)值前面增加了一位符號(hào)位(即最高位為符號(hào)位):正數(shù)該位為0,負(fù)數(shù)該位為1(0有兩種表示:+0和-0),其余位表示數(shù)值的大小。
優(yōu)點(diǎn):
簡(jiǎn)單直觀;例如,我們用8位二進(jìn)制表示一個(gè)數(shù),+11的原碼為00001011,-11的原碼就是10001011
缺點(diǎn):
原碼不能直接參加運(yùn)算,可能會(huì)出錯(cuò)。例如數(shù)學(xué)上,1+(-1) = 0,而在二進(jìn)制中00000001+10000001=10000010,換算成十進(jìn)制為-2。顯然出錯(cuò)了。
反碼
反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
補(bǔ)碼
補(bǔ)碼表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。
在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理;同時(shí),加法和減法也可以統(tǒng)一處理。此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過(guò)程是相同的,不需要額外的硬件電路。
數(shù)的表示
在原碼中,0的表示有兩種(+0)0000 0000、(-0)1000 0000,這樣就產(chǎn)生了編碼映射的不唯一性,在計(jì)算機(jī)上就要區(qū)分辨別。然而+0、-0卻沒(méi)有什么現(xiàn)實(shí)意義。
數(shù)的運(yùn)算
為了解決上述數(shù)的表示問(wèn)題,我們可以強(qiáng)制把轉(zhuǎn)換后的10000000強(qiáng)制認(rèn)定為-128。但這又出現(xiàn)了一個(gè)新的問(wèn)題就是數(shù)的運(yùn)算。數(shù)學(xué)上,1+(-1)=0,而在二進(jìn)制中00000001+10000001=10000010,換算成十進(jìn)制為-2。顯然出錯(cuò)了。所以原碼的符號(hào)位不能直接參與運(yùn)算,必須和其他位分開(kāi),這就增加了硬件的開(kāi)銷和復(fù)雜性。
這個(gè)時(shí)候就要引入補(bǔ)碼,補(bǔ)碼表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。反碼定義為:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
為什么要引入補(bǔ)碼呢?
先解決第一個(gè)問(wèn)題,引入補(bǔ)碼是為了解決計(jì)算機(jī)中數(shù)的表示和數(shù)的運(yùn)算問(wèn)題,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理,即引用了模運(yùn)算在數(shù)理上對(duì)符號(hào)位的自動(dòng)處理,利用模的自動(dòng)丟棄實(shí)現(xiàn)了符號(hào)位的自然處理,僅僅通過(guò)編碼的改變就可以在不更改機(jī)器物理架構(gòu)的基礎(chǔ)上完成的預(yù)期的要求。
總結(jié)
以上是生活随笔為你收集整理的Golang进位计数制(进制)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 入夏多吃这些“杀菌菜”
- 下一篇: 海盗中间件:美团服务体验平台对接业务数据