1. 程式人生 > >五分鐘教會你任何進位制之間的互相轉換

五分鐘教會你任何進位制之間的互相轉換

什麼是進位制?

進位制也就是進位制,是人們規定的一種進位方法。 對於任何一種進位制—X進位制,就表示某一位置上的數運算時是逢X進一位。 十進位制是逢十進一,十六進位制是逢十六進一,二進位制就是逢二進一,以此類推,x進位制就是逢x進位。

常見的進位制

  • 二進位制 Binary
  • 八進位制 Octal
  • 十進位制 Decimal
  • 十六進位制 Hexadecimal

對應關係

二進位制 八進位制 十進位制 十六進位制
0000 0 0 0
0001 1 1 1
0010 2 2 2
0011 3 3 3
0100 4 4 4
0101 5 5 5
0110 6 6 6
0111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 10 A
1011 13 11 B
1100 14 12 C
1101 15 13 D
1110 16 14 E
1111 17 15 F

進位制之間的轉換

進位制轉換

轉換關係

  • 十轉二
  • 十轉八
  • 十轉十六
  • 二轉八
  • 二轉十
  • 二轉十六
  • 十六轉二
  • 十六轉八
  • 十六轉十
  • ……

這麼多進位制之間的轉換,看完以後就再也不打算學了!其實根本沒有那麼複雜,上面的轉換關係可以精簡成如下關係:

  • 十轉其他
  • 其他轉十

十轉X

整數部分,對X短除取餘倒序
小數部分,與X相乘取整正序

X轉十

按權展開求和

什麼是權?

例如十進位制數 111,三個“1”放在不同的位置,所代表的意義也不同。從左到右分別為 100,10,1。還可以表示為: 1×102 1×101 1×100
這裡面 10x 就叫做權,二進位制則為 2x ,八進位制為 8x ,以此類推。

OK,現在是不是簡單了。到這裡可能有人會有疑問了,你只說了十進位制和其他進位制之間的轉換,那其他進位制之間的轉換呢?彆著急往下看:

我們以二進位制和十六進位制的轉換為例,首先大家看一下上面那個對應關係表,很容易就會發現一個規律——四位二進位制數剛剛對應一位十六進位制數所表示的範圍(二進位制的0000-1111對應十六進位制的0-F)。OK知道這個規律以後,一切都變得明瞭了。那麼將9F(H)轉成二進位制就可以分別將9和F轉成四位二進位制數,然後組合起來就好了,如下圖:

十六進位制轉二進位制

那麼9F(H)轉成二進位制數就是10011111,二進位制轉十六進位制就是先講二進位制數四位一組的規則分好組,然後轉成對應的十進位制數(超過十的用A-F表示)。八進位制和二進位制的轉換也是這個規律,只不過對應關係變成了三位二進位制數對應一位八進位制數而已。

PS:八進位制和十六進位制之間不能直接轉換,八進位制需要先轉成二進位制或十進位制,在有對應的二進位制或十進位制轉成十六進位制,反過來也一樣。

還沒想好

十進位制轉其他進位制的短除法我覺得還是有點麻煩,有沒有更簡單的方法呢?當然有啦,哈哈哈!其實方法很簡單,就三個字——找節點。

節點表

二進位制的權 二進位制數 十進位制
20 1 1
21 10 2
22 100 4
23 1000 8
24 10000 16
25 100000 32
26 1000000 64
27 10000000 128
28 100000000 256
29 1000000000 512
210 10000000000 1024

  
這個表有什麼用呢?比如我們要將578轉成二進位制,我們不用短除法,我們看看上面表中與578最相近的數是多少?很容易就找到512,它是 29 對應的二進位制數是1000000000(一個1後面九個0,2的n次方對應的二進位制數是1後面n個0),578-512=66;再去表中找和66最相近的數,很容易找到了64,它是 26 ,對應的二進位制數是100000,66-64=2;2對應的二進位制是10。這樣很容易就計算出578對應的二進位制數為1001000010。

十轉八和十轉十六同理,不再贅述了。

總結

通過上面的分析,我們知道只要掌握了十進位制和任何一種進位制之間的轉換,那麼我們就掌握了所有進位制之間的互相轉換了。而且我們還知道下面的規則:

十轉X

整數部分,對X短除取餘倒序
小數部分,與X相乘取整正序

還可以通過找節點的方式進一步簡化

X轉十

按權展開求和