二進位/八進位/十進位/十六進位 怎麼學會?是怎麼算的方式?
能耐心點教我,謝謝
我們先思考一下,如何用有限的符號表達一個很大的數字?例如我們有阿拉伯數字 0~9,那麼我們可以用這個集合內的符號表達 0~9 範圍內的數。那麼我們如何表達十百乃至千萬呢?
可以想到的,也是我們現在正在使用的做法是,把大數拆成多個部分,每個部分都可以用我們現有的符號表示,這些符號再通過一定的組合方式就可以還原原來的大數。至於為什麼不用更多符號……多麻煩啊。
拆分的方法是,首先設置一個數作為進位數,然後用大數反覆除以這個進位數,把每一次除法的商和餘數記錄下來,然後用定位原理就可以表示這個數。
打個比方,我們有一堆圍棋棋子,但是它的數量遠遠超過我們用一個符號能表示的範圍。我們就要設計一套可以通過我們已有的符號來表示它的數量的方法。為什麼要用棋子……因為便宜啊,而且形狀規整容易計數。
首先我們要設置一個進位數。例如我們一隻手有五根手指,那就用五進位好了。接下來我們要用五去除這堆棋子數,於是我們找來五個筐。我們每一輪把這堆棋子依次往每個筐里放入一枚,確保這一輪操作結束之後,每個筐里的棋子數量是一樣多的。
進行了若干輪之後,五個筐里分別裝了許多棋子。我們發現接下來的棋子數量只有 3 枚,下一輪不夠放了。那麼我們就先暫停放棋子的步驟,把 3 這個數字記下來。接下來我們來看每個筐,筐裡面的棋子數量還是多得超過我們的符號範圍,但是我們可以確定的是,因為每個筐里棋子的數量相同,那麼我們就可以根據一個對應關係(例如在每顆棋子上面做標記,然後統計它們進入筐里的順序)將每顆棋子與其它幾個筐里的棋子一一對應起來,這樣我們就可以用一個筐里的棋子數目來表示五個筐。於是我們把多出來的 3 枚棋子和四個筐里的棋子倒出來放到一邊,然後把剩下這一筐的棋子拿出來,繼續平均放到五個筐里去。分到最後多出來 2 枚棋子,然後看筐里,運氣不錯,每個筐里都有 1 枚棋子,這個數我們就可以用我們的符號來表示了。
這一系列步驟中我們依次得到了三個數字,3,2 和 1。這三個數字的意義顯然不一樣。它們的意義分別是什麼呢?
第一個 3 表示,對於我們要表示的大數,用五去除,餘數是 3。第二個 2 表示,對於上一步得到的商,我們繼續用五去除,餘數是 2。注意這個餘數和上一步的 3 是不同的:這個 2 代表的不是 2 枚棋子,而是這枚棋子本身以及它和其它四個筐里與它一一對應的另外四枚棋子,也就是五枚。換言之這個餘數代表的意義其實是 2×5。最後一個 1 的意義是,其實如果我們再做一步除法的話,結果是第一輪就結束——筐里沒有棋子,然後餘數是 1。然後這個 1 對應的,是第二輪中的五枚棋子,以及這五枚棋子在第一輪中所對應的 5×5 枚棋子。
實際上我們可以注意到,在每一步除法中,每一枚棋子的意義都不一樣。一開始它們只對應自己,再往後它們就對應了多枚棋子。這正是定位計數法的重要特徵:數字的意義與其所在的位置有關。對於 3,2 和 1 這三個數字,1 對應的數最大,其次是 2,最後是 3。那麼我們把它們並排寫在一起,然後把我們使用的進位數標記出來,就得到了這堆棋子的數量: 枚。
我們強調定位計數法是因為有的計數法並不是採用這樣的位置關係,典型如羅馬數字。
那麼我們有一個用這個表示法表示出來的數字了,我們要怎麼還原它的值呢?
例如十進位下的 333,雖然三個都是數字 3,但根據我們標記這個數步驟,它們的意義是不同的。最後一個 3 表示這個數中含有 3 個 ,即找來十個筐投棋子,第一次有 3 個多出來;第二個 3 表示這個數中含有 3 個 ;第一個 3 表示這個數中含有 3 個 。那麼這個數的大小,就是。
為什麼是 10 呢?因為我們這裡舉的例子是十進位。我們也可以換用別的進位來看看。
同樣是 333,現在我們規定這是個七進位下的 333,即 。那麼這三個數字的意義就改變了。最後一個 3 表示這個數中含有 3 個 ,第二個 3 表示這個數中含有 3 個 ,第一個 3 表示這個數中含有 3 個 。於是這個數就是。之前我們得到的 的意義即 。
最難的骨頭吃掉了下面的就輕鬆加愉快了。
進位之間的想互轉換,說白了就是上面我們表示以及還原一個數的過程。反覆除以進位數,把每一步的餘數從大到小列出來,就是新進位下的數。二進位的意思是,我們只有兩個筐。也就是說我們分棋子能得到的餘數,要麼是 1,要麼是 0。也即二進位計數只有 0 和 1 兩個數字。八進位即 0~7。十六進位的話超過了阿拉伯數字的範圍,我們就把字母 A~F 借來。反正這個只是符號而已,它的意義是它背後的數。
不過值得注意的是,因為 ,,所以二進位與八進位、十六進位之間的轉換非常方便。把一串二進位數字從後往前三位劃為一組,然後把每一組視作進位數的話,這個進位數就是 。同理從後往前四位一組,每一組就是 16。所以我們只要準備一張換算表格,就能在二進位與八進位、十六進位之間快速轉換:Bin Oct
--------
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
十六進位同理。
所以二、八、十、十六四種進位之間的轉換,簡單來說就是通通以二進位作為跳板。我大概講清楚了吧。謝捧場。
Bonus:
計算機用電氣信號表示二進位很方便這不用多說;在一些低級語言的開發中,倒是有定位原理的體現。
例如 AVR 開發板有一個數字鍵盤。獲取數字鍵盤輸入的做法大致是輪詢……這個也不多說了。我們每按下一個數字,它就會向系統返回一個信號。那麼我們要如何確保依次按下 123,它會返回我們需要的數一百二十三,而不是一個簡單的字元串 「123」 ?
答案是,當輸入一個數字的時候,就把前面輸入的數乘以十,再加上新鮮輸入的這個數。生活中,人腦對很多事物都形成了條件反射,比如數字,習慣了十進位的我們可以很方便的對數字25、27進行大小比較和數值運算,卻很難對二進位數字11001、11011有直觀的感受。
其實想要弄清楚這些進位很簡單,十進位各位都很熟悉,那先從十進位入手。
十進位計數規則是:
- 基數為10。
- 有10個數字,0、1、2、3、4、5、6、7、8、9。
- 逢10進1,借1當10。
那麼,二進位計數規則就是:
- 基數為2。
- 有2個數字,即0和1。
- 逢2進1,借1當2。
十進位可以有多位組成,從右向左依次為個位、十位、百位、千位、萬位...
於此類似,那麼二進位也可以由多位數組成,從右向左分別為1位、2位、4位、8位、16位...
為什麼稱二進位的位數為1位、2位、4位...
其實這是從十進位的角度看二進位各位數得出的名稱。
看上表,當二進位產生進位時,代表的十進位數為2、4、8、16、32、64、128...
二進位雖然只有0和1兩個數字,但是由於數字所處的位置不同,表示的數據也不同,例如:
二進位數 「1011」
這個二進位數共有4位,由3個1和1個0組成,比如數字1所處位置不同,所代表的大小也不同,其所處位置稱作權。從右向左順序各個位表示十進位的含義:
第一個1表示:1的個數
第二個1表示:2的個數
第三個0表示:4的個數
第四個1表示:8的個數
所以,二進位數1011由1個8,0個4,1個2,1個1組成。按各位的權列出:
按這種權展開式可以很方便將二進位轉換為十進位。
相應的,十進位轉換成二進位整數就通常採用「除2取余,逆序排列」的方法。具體做法是用2整除十進位整數,可以得到一個商和餘數,再用2去除商,又會得到一個商和餘數,如此反覆,直到商為0停止。再把先得到的餘數作為二進位低位有效位,後得到的餘數作為二進位高位有效位,依次排列。
舉個栗子:
將十進位「11」轉換為二進位。
將十進位11轉換為二進位數為1011。
和十進位相比,二進位的運算規則也就簡單多了。
加法
二進位運算只會有以下4種可能:
(逢二進一)
對於多位數二進位相加,考慮進位採用「逢2進1」的方式,例如十進位25(二進位11001)加上十進位27(二進位11011):
減法
也只有4種可能:
(借一當二)
乘法
十進位可以按照九九乘法表運算,二進位乘法規則就簡單多了,也有4種情況:
二進位乘法也可以很簡單轉換為加法運算,例如十進位25(二進位11001)乘以十進位5(二進位101)。
除法
除法是乘法的逆運算,二進位乘法有4種,除法也是應該對應4種,考慮0作為除數是沒有意義的。所以除法有以下兩種:
例如十進位25(二進位11001)除以十進位5(二進位101)。
比較複雜的乘法和除法運算都能簡單的轉換為加、減和位移操作,所以一般計算機也只需要設計一個加法器即可。
二進位弄清楚了,八進位也就很好懂了。
其實很早,古人就明白了八進位的概念,比如八卦...
八卦最初就是古人的記事符號,只是後來作為占卜工具被打上封建迷信的標誌。
其中隱含著二進位和八進位的概念。
八卦的基本元素就是陰和陽,相當於二進位中的0和1。
下圖中用長實線代表「陽」,用中間斷開的線代表「陰」,然後由3種這樣的線條組成8種形狀,相當於3位二進位數表示8種狀態。
當然,八進位計數不可能用八卦表示,通常採用0-7的阿拉伯數字表示
八進位的計數規則:
- 基數為8。
- 由8個數字組成,分別是0、1、2、3、4、5、6、7。
- 逢8進1,借1當8。
十六進位,在古代中國當時使用的重量單位就是十六進位,16兩為1斤,就有了所謂的「半斤八兩」。
同樣十六進位的計數規則為:
- 基數為16。
- 由16個數字元號組成,分別是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
- 逢16進1,借1當16。
各種進位的轉換
前面二進位和十進位相互轉換的方法,同樣適用於其他進位的數轉換為十進位。
「按權展開」—其他進位轉換為十進位(B表示各進位的基數,n表示位數):
例如十六進位數BC0D轉換為十進位:
「除基數B取余,逆序排列」方法可以將十進位數轉換為任意進位數。
二進位和八進位、十六進位數的轉換可以採用更簡單的方法。
二進位轉換為八進位,採用「3位並1位」,按從右向左方向,每3位二進位位一組,最高位不足3位,添0補足3位,然後將各組3位二進位數加權展開,得到八進位數。
將八進位轉換為二進位採用相反的操作「1位拆3位」。
類似的,十六進位和二進位轉換為「4位並1位」,「1位拆4位」的方法,在此就不再啰嗦了。
關於十進位轉換成二進位.
1.符號相加記數法
古人用符號代表10 100 1000 這樣的數字,利用不同符號的相加來表示一個數.比如古埃及的記數法
相加法維基百科傳送門:符值相加記數法2.進位制
然後文明發展到一定程度的時候,需要進行大數計算的時候用符號相加實在是太麻煩了,於是發明了進位制.以十進位舉例:
十進位中只有10個符號 0,1,2,3,4,5,6,7,8,9 其中的0在這裡表示的是一個什麼都沒有的佔位符,當人數要書寫十這個數字的時候你會發現沒有符號可以來表示十這個數字了,於是在右邊寫上一個1然後用0代替進位的部分,直到數字不夠用了再次進位.十進位也可以理解用相加法理解
比如203這個數: 2*10^2 + 0*10^1 + 3*10^0 = 203因為使用進位第一位數是沒有進位的所以是0次方,每進一次位指數加1.
進位制維基百科傳送門:https://zh.wikipedia.org/wiki/%E8%BF%9B%E4%BD%8D%E5%88%B6
3.二進位
整個數學符號只有0和1,依靠進位制的進位來表示數. 舉例: 二進位轉換成十進位 1011 = 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = (8)+(0)+(2)+(1) = 11二進位的1011和十進位的11都代表著同一個數十一,也就可以理解為1011=11
4.十進位轉換成二進位:湊數法
湊數法: 把十進位的17轉換成二進位是多少?2^0 2^1 2^2 2^3 2^4
1 2 4 8 16所以這個數的二進位最多只有五位,然後在每一位帶入最大可以容納的
二進位數.16,0,0,0,1 = 10001
可以試一下別的數然後用windows自帶計算機轉換下.5.十進位轉換成二進位:短除法
首先是一個十進位203的除以自身進位數的短除法,從個位開始退位的操作所以第一退下來的餘數是個位的.同樣道理二進位可以用除2來退位.(如果有錯誤請在評論區留言指正謝謝)
字寫的比較丑..乃們看的懂就好了T.T直接上圖。
原文鏈接:《數制》——雖然簡單,你未必知道
要回答這個問題,先讓我們從我們最開始學習數學的那個方法開始,數手指!! 我們開始學習數學比如桌上放4個蘋果,我們拿出右手開始數,大拇指,食指,中指,無名指。正好,一一對應。學會了,接著是放7個蘋果,先拿出左手,大拇指,食指,中指,無名指,小拇指,然後右手大拇指,食指。又正好,一一對應。這是最簡單的情況。然後,無良老師開始加大難度,一口氣拿出了15個蘋果,怎麼辦, 兩隻手都數完了。同學們開始開動腦筋, 普通青年這樣做,伸出腳,吧左腳加進來,又是正好,一一對應。但是,A同學覺得當眾脫鞋子襪子不是那麼文雅禮貌,於是他苦思冥想,終於想出了一個用雙手表示16個蘋果的辦法:用左手開始,大拇指,食指,中指,無名指,小拇指,接下來伸出右手大拇指,左手手指全部收回,用右手的一個手指表示左手所有手指的數目。於是三個來回,左手還剩下一個大拇指,右手伸出了大拇指, 食指,中指。正好,雖然不是一一對應,但只要稍一解釋,我的右手一個手指頂一隻手,也就成了。這就是6進位,因為這麼數下來只能數0-5,永遠出現不了6。但是,2進位怎麼辦?好辦。我們想像,有一個星球上住了這麼一群外星人,他們每個手只有一隻手指,卻有10隻手。我們像我們前面數一樣,後一隻手的一個手指表示前一隻手的手指數加1,於是當他一個一個數過去,把第五隻手伸出而前面的手指都收回來時就恰好表示了16個蘋果。同理,8進位,16進位都是一樣,每隻手的手指數不同而已。 以上,望題主能更好的理解進位這個概念。
懂這些的給我唯一的幫助就是秒懂這個段子:
世界上只有10種人,1種是懂二進位的,1種是不懂二進位的。
其實你不用想的那麼難,滿多少進一,比如十進位滿10進一,二進位滿二進一,所以計算機語言是二進位的又叫0,1代碼,因為只有0和1,八進位只有0123456數字,因為滿8就進1,16進位是一樣的滿16進1,是有0123456789abcdef構成。如果想進行轉化的話,轉化為10進位是乘,十進位轉化其他進位用除,其他進位轉化則可以先轉化為十進位在轉化為其他進位。舉個例子8轉化為二進位,8除以2餘0,用4再除2餘0,2再除2是1,結果8用二進位就是100。再轉化為十進位,0乘2的零次方加上0乘2的一次方加上一乘2的三次方。結果是不是8呢。不懂可以加微信詳細解答yzzp19981227
看書《編碼——隱匿在計算機軟硬體背後的語言》(《編碼的奧秘》)
謝邀.....首先,我教人的話其實極搓,所以你看了下面的沒學好也不要憂傷......二進位八進位十六進位剛開始可以當作一類,既是把它們轉成二進位再轉10進位來計算,然後再轉成你想要的,十和二的互轉相信你書上有,我只能說筆算想增加速度的話背到64768,就差不多滿足需要了,至於很大的數,計算器可以解決,另外二轉八是每三個一組,轉16是每四個一組,其實先轉16,再轉10快點,不過一般人不熟悉
二進位,八進位,十進位,十六進位之間的轉換演算法網上一搜不是一大片嗎。。最好問些具體的問題,不要這樣範范而沒有目的性的提問
推薦閱讀:
※有哪些不錯的介紹計算機體系結構的書籍?
※為什麼VS2017在win10運行界面變模糊?
※我想了解計算機發展史,有哪些書可以看?
※3個1次操作的for循環和1個for循環3次操作效率是一樣的嗎?
※將系統語言設置成英文,對提高英語水平有幫助嗎?