咱們在生活中用到數字,都是以十進制的方式計數的。稍有計算機常識的人都知道,計算機中是以二進制的方式計數的,另外在計算機中表示顏色常常會用到十六進制的數字,此外在其餘一些領域還會用到八進制的數字。那麼二進制、八進制、十進制、十六進制的數字,到底是怎樣計數的?它們之間是怎樣相互換算的?本文就來詳細說說這兩個問題。算法
首先來講咱們最熟悉的十進制。十進制計數法有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種狀況能夠分紅如下三類ide
以上算式運算獲得的值是168,因此一、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轉換爲十六進制的數字爲72Bblog
以上咱們已經講解了數制之間轉換的兩種類型,分別是其餘進制轉換爲十進制和十進制轉換爲其餘進制。如今就只剩第三種,那就是其餘進制數字之間的轉換。首先咱們講一下二進制轉換爲十六進制數的算法。在講算法以前,必須先講一下二進制數和十六進制數有什麼關係。咱們知道,二進制數只有兩個原始數字分別是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種變化的可能性。
咱們仍然用剛纔這個二進制數字進行舉例,其轉換過程以下:圖片
如想系統學習Java編程,歡迎觀看我在本站的視頻課程。it