Java千問:各種數制及數制間轉換算法詳解

我們在生活中用到數字,都是以十進制的方式計數的。稍有計算機常識的人都知道,計算機中是以二進制的方式計數的,另外在計算機中表示顏色經常會用到十六進制的數字,此外在其他一些領域還會用到八進制的數字。那麼二進制、八進制、十進制、十六進制的數字,究竟是怎樣計數的?它們之間是怎樣相互換算的?本文就來詳細說說這兩個問題。

一、多種進制的計數方法

首先來說我們最熟悉的十進制。十進制計數法有10個原始的數字,分別是0-9,當我們想表示一個比9還大1的數字時,1個數位就不夠用了,必須用兩位數來表示,就是10,再比10大1的數是11...以此類推這樣就能表示出任意大的數字。

而計算機中使用的二進制計數法,二進制計數法只有兩個原始數字,就是0和1,想表示比1還大1的數字就需要用兩位數來表示,就是10,之後是11,再之後是100...二進制計數法中最大的數字就是1,再增加的話就要進位了。這樣以此類推也能表示任意一個數字。

通過學習二進制計數法,想必大家已經知道八進制數的特點了,那就是總共有8個原始數字,分別是0-7,當表示比7還大1的數字時,就必須進位了。

那麼再來說說十六進制計數法。十六進制計數法中,有16個原始數字,前10個原始數字我們就用0-9來表示,但我們習慣使用的阿拉伯數字只有0-9這10個數字,現在還差6個原始數字,怎麼辦呢?我們就用字母去代替,這樣的話第11個原始數字就A,第12個原始數字就是B,以此類推,第16個原始數字就是F。這個F換算成10進制數其實就是15。當表示比F還要大1的數字,就需要進位了,所以F再向後數就是10,11...小夥伴們可能非常不習慣16進制的技術方法,因爲突然跑出來一些字母來表示一個數字,其實用多了自然也就習慣了。

 

二、數制的相互轉換

下面我們來說說這些數制之間如何相互轉換。剛纔提到的4種進制的數字,相互轉換的話有12種情況,請看下圖:

從這幅圖片上大家可以看到,各種數制之間相互轉換情況的所有情形:四種數制之間相互連線,總共可以連12條線。很多小夥伴的第一反應就是:這麼多種情況,又要記很多轉換規則。其實大可不必擔心,我們可以把這12中情況分成3種類型,並且掌握每種類型的算法就可以了。12種情況可以分成以下三類

  1. 其他進制的數轉換爲10進制
  2. 10進制的數轉換爲其他進制的數
  3. 其他數制之間相互轉換

首先我們來說說其他進制的數怎樣轉換爲10進制的數。當我們拿到一個10進制的數字,比如168,那麼168爲什麼是168呢?小夥伴們都會說這不是廢話嗎?168不是168還能是多少?其實168這個數字是由3個原始數字1、6和8組成的,這3個原始數字分別佔據百位、十位和個位,這樣,我們可以把168這個數字分解成以下形式:

以上算式運算得到的值是168,所以1、6和8這3個原始數字排列起來就能表示168。

這裏需要強調一個細節,因爲我們現在討論的是10進制的數字,這三個原始數字都是乘以以10爲底的n次方。按照這個原理,如果討論的是2進制數字,那麼計算一個數就應該是原始數字乘以以2爲底的n次方,然後再把各個數字相加,最後就能得出這個數字的具體值了,比如一個二進制數101,按照剛纔的算法,可以把101分解成以下形式:

以上算式運算得到的值是5。這就是二進制轉換爲10進制數的基本原理。

同樣的,我們也可以把十六進制和八進制的數轉換爲十進制,比如十六進制的數1AF,可以分解成如下形式:

我們在運算時把A和F直接替換成對應的十進制數就是10和15,以上算式運算最終得到的十進制數就是431。通過幾個例子,相信大家已經掌握了其他進制的數轉換爲十進制數的算法。這個算法的套路就是把各個位上的數字與M爲底的n-1次方相乘,然後把相乘的結果都加起來,需要注意的是:幾進制轉換十進制,那麼M就是幾,比如要把二進制轉換爲十進制,這個M就是2。而所謂的n就是從右邊數第幾位,比如對於從右邊數第3位的數字,n就是3,而n-1就是2。

 

剛纔我們講的是第一種類型,就是把其他進制的數字轉換爲十進制,下面我們再來說說十進制的數如何轉換爲其他進制的數。十進制的數如何轉換爲其他進制的數算法我們可以稱之爲“輾轉求餘法”。所謂“輾轉求餘法”就是指不斷的用十進制的數字除以N,直到商爲零爲止,之後把每次除法操作所得到的餘數串起來就完成了轉換。這裏要說明的是,如果是希望轉換爲二進制的數,那麼就是不斷除以2,同理,如果是希望轉換爲八進制的數,就不斷的除以8。我們就以十進制轉換爲二進制爲例來爲大家講解這個算法。比如我們要把十進制的數字13轉換爲2進制,就可以用以下方式完成轉換:

運算的過程如上圖所示:把13除以2,得到的商如果不爲0,那麼就以除法得到的商繼續除以2,一直到商爲0爲止,最後把每次除法操作所得到的餘數從下到上串起來,得到的結果就是1101。

下面再來講一個十進制數轉換爲十六進制數的例子。比如把1835這個數字轉換爲十六進制,算法是一樣的,只不過這次是不斷的用這個數字除以16,過程如下圖所示:

把餘數中大於9的餘數替換爲字母,也就是把11替換爲B,這樣就得到了1835轉換爲十六進制的數字爲72B

 

以上我們已經講解了數制之間轉換的兩種類型,分別是其他進制轉換爲十進制和十進制轉換爲其他進制。現在就只剩第三種,那就是其他進制數字之間的轉換。首先我們講一下二進制轉換爲十六進制數的算法。在講算法之前,必須先講一下二進制數和十六進制數有什麼關係。我們知道,二進制數只有兩個原始數字分別是0和1,也就是說,二進制數的每一個位只有兩種情形,非0即1。按照排列組合的算法,如果我們想排列出4種情形,只用1位二進制數是無法實現的,因爲二進制數的每一個位只有2種情形。要排列出4種情形,那必須用2位數,同理,想排列出8種情形,要用3位數,想排列出16種情形,必須用4位數。而十六進制數有16個原始數字,也就是說十六進制數僅僅1個位上的數字就都有16種變化的可能性。那麼這樣我們就很容易理解一個道理,那就是:十六進制數的1位所能表示的數字,相當於二進制數4位所能表示的數字。

按照這種思想,我們把二進制數轉換爲十六進制的數時,首先把每4位二進制數劃分爲一組,把每一組二進制數字分別轉換爲一位十六進制數。劃分時候從最右邊開始,每4位分爲1組,如果劃到左邊發現不夠4位時,就讓剩餘的這幾個數單獨劃分爲一組。例如,二進制數101 1011 1000 1110轉換爲十六進制數過程如下:

如上圖所示:從右邊開始,每4位分爲一組,左邊不足4位的單獨劃分爲一組,之後把每組二進制數先轉爲十進制數,然後把大於9的數字用字母代替,最後就產生了轉換的結果5B8E。

這個例子是把二進制數字轉換爲十六進制,在轉換的時候是把4位二進制數劃分爲一組進行轉換,如果想把一個二進制數字轉換爲八進制數該怎麼辦呢?很多同學肯定會立刻想到,在轉換的時候把3位二進制數劃分爲一組,爲什麼是3位劃分一組呢?原因很簡單,就是因爲每3位二進制數可以排列出8種情形,而八進制數每1位數字就有8種變化的可能性。

我們仍然用剛纔這個二進制數字進行舉例,其轉換過程如下:

轉換結果爲55616。因爲3位二進制數不可能組合出比8還大的數字,所以不會出現用字母替換數字的情況,那麼我們所得到的這個數字本身就已經是一個八進制數了。

以上講解的是用二進制數轉換爲十六進制和八進制數,那麼八進制數怎麼轉爲二進制數十六進制數如何轉換爲八進制數?八進制怎麼轉化爲十六進制等等。這幾種情況確實不太容易直接轉換,其實大家也不必擔心,我們可以用兩步來實現,首先把某種進制的數字轉成十進制數,以十進制數爲媒介,再轉換爲另一種數制就可以了。比如就拿剛纔的數字來說,如果我們希望把八進制數字55616轉換爲十六進制數,可以先把這個八進制數轉換爲十進制數23438,再把十進制的數字23438轉換爲十六進制數5B8E就可以了。總之,所有不方便轉換的情況,都可以先轉換爲十進制數,然後再進行二次轉換。這樣,任意兩種數制之間就都能夠實現相互轉換了。

 

如想系統學習Java編程,可以點擊這裏觀看我在本站的視頻課程,有問題也可以加入我的QQ羣291839907一起討論。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章