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