關於進製,前幾天一朋友詢問二進位制和十六進製制的區別。遂在此總結一下關於進製的相關知識,回憶一下計算機的基礎內容,也幫朋友更好的理解一下。
進製是一種記數方式,亦稱進製計數法或位值計數法。利用這種記數法,可以使用有限種數字符號來表示所有的數值。一種進製中可以使用的數字符號的數目稱為這種進製的基數或底數。若乙個進製的基數為n,即可稱之為n進製,簡稱n進製。現在最常用的進製是十進位制,這種進製通常使用10個阿拉伯數字(即0-9)進行記數 ——維基百科從定義中我們可以看到,進製是一種計數方式。說的更直白一些:當我們在談進製的時候,我們是在談數字的不同展示方式,是在用不同的方法數數,稱之為計數法。我們可以用不同的進製來表示同乙個數。比如:十進數57(10),可以用二進位制表示為111001(2),也可以用五進製表示為212(5),同時也可以用八進位制表示為71(8),可用十二進位制表示為49(12),亦可用十六進製制表示為39(16),它們所代表的數值都是一樣的。
我們詳細看下,進製是如何來進行計數的。我們從最常用的十進位制來看下。0,1,2,3,4,5,6,7,8,9......743,3432...我們平常見到數字都屬於十進位制。大家看到不論數是多少,有多大,都是由0-9這十個數字組成的。我們有沒有想過,為什麼是這樣...能不能不是這樣。 據說人類算數採用十進位制,可能跟人類有十根手指有關。亞里斯多德稱人類普遍使用十進位制,只不過是絕大多數人生來就有10根手指這樣乙個解剖學事實的結果.....好了,我們不去糾結我們為什麼採用十進位製作為通用的計數法,這裡需要引出乙個概念:滿十進一,借一當十。這就是為什麼十進位制只有0-9 這10個數,
十進位制規定:從0開始計數,一共十個數。從0到9,滿十進一。即比9大乙個的數,滿十,借一當十,用0補齊位數,記為10。
同樣二進位制:從0開始計數,一共二個數。從0到1,滿二進一。比1大乙個數,滿二,借一當二,用0補齊位數,同樣記為10。
有意思的地方「10在十進位制表示10=9+1」9為10進製的最大計數, 二制則表示「10=1+1」 1表示二進位制的最大計數值。應該比較好理解了。其他進製同理,在此不再贅述。
十轉換其他進製:除n取餘法(n為進製,例二進位制,十六進製制)
除2取餘方法:除2取餘法,即每次將整數部分除以2,餘數為該位權上的數,而商繼續除以2,餘數又為上乙個位權上的數,這個步驟一直持續下去,直到商為0為止,最後讀數時候,從最後乙個餘數讀起,一直到最前面的乙個餘數。
例:將十進位制的(43)d轉換為二進位制的步驟如下:
1. 將商43除以2,商21餘數為1;
2. 將商21除以2,商10餘數為1;
3. 將商10除以2,商5餘數為0;
4. 將商5除以2,商2餘數為1;
5. 將商2除以2,商1餘數為0;
6. 將商1除以2,商0餘數為1;
7. 讀數,因為最後一位是經過多次除以2才得到的,因此它是最高位,讀數字從最後的餘數向前讀,101011,即(43)d=(101011)b。
方法1:除16取餘法,即每次將整數部分除以16,餘數為該位權上的數,而商繼續除以16,餘數又為上乙個位權上的數,這個步驟一直持續下去,直到商為0為止,最後讀數時候,從最後乙個餘數起,一直到最前面的乙個餘數。其他進製轉換十進位制:例:將十進位制的(796)d轉換為十六進製制的步驟如下:
1. 將商796除以16,商49餘數為12,對應十六進製制的c;
2. 將商49除以16,商3餘數為1;
3. 將商3除以16,商0餘數為3;
4. 讀數,因為最後一位是經過多次除以16才得到的,因此它是最高位,讀數字從最後的餘數向前讀,31c,即(796)d=(31c)h。
方法2:使用間接法,先將十進位制轉換成二進位制,然後將二進位制又轉換成十六進製制;
方法:二進位制數從低位到高位(即從右往左)計算,第0位的權值是2的0次方,第1位的權值是2的1次方,第2位的權值是2的2次方,依次遞增下去,把最後的結果相加的值就是十進位制的值了。例:將二進位制的(101011)b轉換為十進位制的步驟如下:
1. 第0位 1 x 2^0 = 1;
2. 第1位 1 x 2^1 = 2;
3. 第2位 0 x 2^2 = 0;
4. 第3位 1 x 2^3 = 8;
5. 第4位 0 x 2^4 = 0;
6. 第5位 1 x 2^5 = 32;
7. 讀數,把結果值相加,1+2+0+8+0+32=43,即(101011)b=(43)d。
方法:八進位制數從低位到高位(即從右往左)計算,第0位的權值是8的0次方,第1位的權值是8的1次方,第2位的權值是8的2次方,依次遞增下去,把最後的結果相加的值就是十進位制的值了。八進位制就是逢8進1,八進位制數採用 0~7這八數來表達乙個數。
例:將八進位制的(53)o轉換為十進位制的步驟如下:
1. 第0位 3 x 8^0 = 3;
2. 第1位 5 x 8^1 = 40;
3. 讀數,把結果值相加,3+40=43,即(53)o=(43)d。
方法:十六進製制數從低位到高位(即從右往左)計算,第0位的權值是16的0次方,第1位的權值是16的1次方,第2位的權值是16的2次方,依次遞增下去,把最後的結果相加的值就是十進位制的值了。二進位制轉換為八進位制,十六進製制:十六進製制就是逢16進1,十六進製制的16個數為0123456789abcdef。
例:將十六進製制的(2b)h轉換為十進位制的步驟如下:
1. 第0位 b x 16^0 = 11;
2. 第1位 2 x 16^1 = 32;
3. 讀數,把結果值相加,11+32=43,即(2b)h=(43)d。
方法:取三合一法,即從二進位制的小數點為分界點,向左(向右)每三位取成一位,接著將這三位二進位制按權相加,然後,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的八進位制數。如果向左(向右)取三位後,取到最高(最低)位時候,如果無法湊足三位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足三位。例:將二進位制的(11010111.0100111)b轉換為八進位制的步驟如下:
1. 小數點前111 = 7;
2. 010 = 2;
3. 11補全為011,011 = 3;
4. 小數點後010 = 2;
5. 011 = 3;
6. 1補全為100,100 = 4;
7. 讀數,讀數從高位到低位,即(11010111.0100111)b=(327.234)o。
方法:取四合一法,即從二進位制的小數點為分界點,向左(向右)每四位取成一位,接著將這四位二進位制按權相加,然後,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的十六進製制數。如果向左(向右)取四位後,取到最高(最低)位時候,如果無法湊足四位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足四位。例:將二進位制的(11010111)b轉換為十六進製制的步驟如下:
1. 0111 = 7;
2. 1101 = d;
3. 讀數,讀數從高位到低位,即(11010111)b=(d7)h。
當我們在談論Flink的時候,我們到底在談論些什麼
目前每當我們聊到當下熱門的計算引擎的時候,無一例外地會聊到apache flink 當下非常火熱的流處理計算框架。更是有人拿它和spark做對比,到底哪個才是現今最好的計算引擎。當然這個已經不是本文所要闡述的主題啦。老實話,筆者本人做的比較多的還是儲存領域,對計算領域的知識不敢說是內行。最近也是抽空...
Linux容器 當我們談容器的時候,我們在談什麼
docker在當下很火,那麼,當我們談docker,談容器的時候,我們在談什麼?或者說,你對docker,對容器了解嗎?容器,到底是怎麼一回事兒?這篇文章著重來講一下linux容器,為什麼強調linux容器,而不是docker,是因為docker是基於虛擬化技術來實現的,但是這篇文章涉及到linux...
當我們在談論HTTP隊頭阻塞時,我們在談論什麼?
通過tcp多路復用降低延遲 單個tcp連線上允許亂序request response,解決隊頭堵塞問題 實現層面上,大部分瀏覽器要求http 2必須開啟tls,一定程度上解決資料安全問題。其中,隊頭阻塞問題真的被解決了嗎?http 1.1為什麼會隊頭阻塞?http 1.1通過pipelining管道...