單片機進位轉換

2021-01-12 電子產品世界

  一、正數

  在高速發展的現代社會,計算機浩浩蕩蕩地成為了人們生活中不可缺少的一部分,幫助人們解決通信,聯絡,互動等各方面的問題。今天我就給大家講講與計算機有關的「進位轉換」問題。

  我們以(25.625)(十)為例講解一下進位之間的轉化問題。

1. 十 > 二

  給你一個十進位,比如:6,如果將它轉換成二進位數呢?

  10進位數轉換成二進位數,這是一個連續除2的過程:

  把要轉換的數,除以2,得到商和餘數,

  將商繼續除以2,直到商為0。最後將所有餘數倒序排列,得到數就是轉換結果。

  聽起來有些糊塗?我們結合例子來說明。比如要轉換6為二進位數。

  「把要轉換的數,除以2,得到商和餘數」。

  那麼:

  要轉換的數是6, 6 ÷ 2,得到商是3,餘數是0。 (不要告訴我你不會計算6÷2!)

  「將商繼續除以2,直到商為0……」

  現在商是3,還不是0,所以繼續除以2。

  那就: 3 ÷ 2, 得到商是1,餘數是1。

  「將商繼續除以2,直到商為0……」

  現在商是1,還不是0,所以繼續除以2。

  那就: 1 ÷ 2, 得到商是0,餘數是1 (拿筆紙算一下,1÷2是不是商0餘1!)

  「將商繼續除以2,直到商為0……最後將所有餘數倒序排列」

  好極!現在商已經是0。

  我們三次計算依次得到餘數分別是:0、1、1,將所有餘數倒序排列,那就是:110了!

  6轉換成二進位,結果是110。

  把上面的一段改成用表格來表示,則為:

  被除數 計算過程 商 餘數

  6 6/2 3 0

  3 3/2 1 1

  1 1/2 0 1

  (在計算機中,÷用 / 來表示)

2. 二 ----> 十

  二進位數轉換為十進位數

  二進位數第0位的權值是2的0次方,第1位的權值是2的1次方……

  所以,設有一個二進位數:0110 0100,轉換為10進位為:

  下面是豎式:

  0110 0100 換算成 十進位

  " ^ " 為次方

  第0位 0 * 2^0 = 0

  第1位 0 * 2^1 = 0

  第2位 1 * 2^2 = 4

  第3位 0 * 2^3 = 0

  第4位 0 * 2^4 = 0

  第5位 1 * 2^5 = 32

  第6位 1 * 2^6 = 64

  第7位 0 * 2^7 = 0 +

  --

  100

  用橫式計算為:

  0 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 + 1 * 2 ^ 3 + 0 * 2 ^ 4 + 1 * 2 ^ 5 + 1 * 2 ^ 6 + 0 * 2 ^ 7 = 100

  0乘以多少都是0,所以我們也可以直接跳過值為0的位:

  1 * 2 ^ 2 + 1 * 2 ^ 3 + 1 * 2 ^ 5 + 1 * 2 ^ 6 = 100

3. 十 ----> 八

  10進位數轉換成8進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成8。

  來看一個例子,如何將十進位數120轉換成八進位數。

  用表格表示:

  被除數 計算過程 商 餘數

  120 120/8 15 0

  15 15/8 1 7

  1 1/8 0 1

  120轉換為8進位,結果為:170。

4. 八 ----> 十

  八進位就是逢8進1。

  八進位數採用 0~7這八數來表達一個數。

  八進位數第0位的權值為8的0次方,第1位權值為8的1次方,第2位權值為8的2次方……

  所以,設有一個八進位數:1507,轉換為十進位為:

  用豎式表示:

  1507換算成十進位。

  第0位 7 * 80 = 7

  第1位 0 * 81 = 0

  第2位 5 * 82 = 320

  第3位 1 * 83 = 512 +

  -

  839

  同樣,我們也可以用橫式直接計算:

  7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839

  結果是,八進位數 1507 轉換成十進位數為 839

  5. 十 ----> 十六

  10進位數轉換成16進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成16。

  同樣是120,轉換成16進位則為:

  被除數 計算過程 商 餘數

  120 120/16 7 8

  7 7/16 0 7

  120轉換為16進位,結果為:78。

6. 十六----> 十

  16進位就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這五個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。

  十六進位數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方……

  所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小為 X * 16的N次方。

  假設有一個十六進數 2AF5, 那麼如何換算成10進位呢?

  用豎式計算:

  2AF5換算成10進位:

  第0位: 5 * 160 = 5

  第1位: F * 161 = 240

  第2位: A * 162 = 2560

  第3位: 2 * 163 = 8192 +

  --

  10997

  直接計算就是:

  5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997

  (別忘了,在上面的計算中,A表示10,而F表示15)

  現在可以看出,所有進位換算成10進位,關鍵在於各自的權值不同。

  假設有人問你,十進數 1234 為什麼是 一千二百三十四?你盡可以給他這麼一個算式:

  1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

7. 二 ----> 八

  (11001.101)(二)

  整數部分: 從後往前每三位一組,缺位處用0填補,然後按十進位方法進行轉化, 則有:

  001=1

  011=3

  然後我們將結果按從下往上的順序書寫就是:31,那麼這個31就是二進位11001的八進位形式

  小數部分: 從前往後每三位一組,缺位處用0填補,然後按十進位方法進行轉化, 則有:

  101=5

  然後我們將結果部分按從上往下的順序書寫就是:5,那麼這個5就是二進位0.101的八進位形式

  所以:(11001.101)(二)=(31.5)(八)

8. 八 ----> 二

  (31.5)(八)

  整數部分:從後往前每一位按十進位轉化方式轉化為三位二進位數,缺位處用0補充 則有:

  1---->1---->001

  3---->11

  然後我們將結果按從下往上的順序書寫就是:11001,那麼這個11001就是八進位31的二進位形式

  說明,關於十進位的轉化方式我這裡就不再說了,上一篇文章我已經講解了!

  小數部分:從前往後每一位按十進位轉化方式轉化為三位二進位數,缺位處用0補充 則有:

  5---->101

  然後我們將結果按從下往上的順序書寫就是:101,那麼這個101就是八進位5的二進位形式

  所以:(31.5)(八)=(11001.101)(二)

9. 十六 ----> 二 ;二 ----> 十六

  二進位和十六進位的互相轉換比較重要。不過這二者的轉換卻不用計算,每個C,C++程式設計師都能做到看見二進位數,直接就能轉換為十六進位數,反之亦然。

  我們也一樣,只要學完這一小節,就能做到。

  首先我們來看一個二進位數:1111,它是多少呢?

  你可能還要這樣計算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。

  然而,由於1111才4位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、1。即,最高位的權值為23 = 8,然後依次是 22 = 4,21=2, 20 = 1。

  記住8421,對於任意一個4位的二進位數,我們都可以很快算出它對應的10進位值。

  下面列出四位二進位數 xxxx 所有可能的值(中間略過部分)

  僅4位的2進位數 快速計算方法 十進位值 十六進值

  1111 = 8 + 4 + 2 + 1 = 15 F

  1110 = 8 + 4 + 2 + 0 = 14 E

  1101 = 8 + 4 + 0 + 1 = 13 D

  1100 = 8 + 4 + 0 + 0 = 12 C

  1011 = 8 + 4 + 0 + 1 = 11 B

  1010 = 8 + 0 + 2 + 0 = 10 A

  1001 = 8 + 0 + 0 + 1 = 10 9

  ....

  0001 = 0 + 0 + 0 + 1 = 1 1

  0000 = 0 + 0 + 0 + 0 = 0 0

  二進位數要轉換為十六進位,就是以4位一段,分別轉換為十六進位。

  如(上行為二制數,下面為對應的十六進位):

  1111 1101 , 1010 0101 , 1001 1011

  F D , A 5 , 9 B

  反過來,當我們看到 FD時,如何迅速將它轉換為二進位數呢?

  先轉換F:

  看到F,我們需知道它是15(可能你還不熟悉A~F這五個數),然後15如何用8421湊呢?應該是8 + 4 + 2 + 1,所以四位全為1 :1111。

  接著轉換 D:

  看到D,知道它是13,13如何用8421湊呢?應該是:8 + 2 + 1,即:1011。

  所以,FD轉換為二進位數,為: 1111 1011

  由於十六進位轉換成二進位相當直接,所以,我們需要將一個十進位數轉換成2進位數時,也可以先轉換成16進位,然後再轉換成2進位。

  比如,十進位數 1234轉換成二制數,如果要一直除以2,直接得到2進位數,需要計算較多次數。所以我們可以先除以16,得到16進位數:

  被除數 計算過程 商 餘數

  1234 1234/16 77 2

  77 77/16 4 13 (D)

  4 4/16 0 4

  結果16進位為: 0x4D2

  然後我們可直接寫出0x4D2的二進位形式: 0100 1011 0010。

  其中對映關係為:

  0100 -- 4

  1011 -- D

  0010 -- 2

  同樣,如果一個二進位數很長,我們需要將它轉換成10進位數時,除了前面學過的方法是,我們還可以先將這個二進位轉換成16進位,然後再轉換為10進位。

  下面舉例一個int類型的二進位數:

  01101101 11100101 10101111 00011011

  我們按四位一組轉換為16進位: 6D E5 AF 1B

二、負數

  負數的進位轉換稍微有些不同。

  先把負數寫為其補碼形式(在此不議),然後再根據二進位轉換其它進位的方法進行。

  例:要求把-9轉換為八進位形式。則有:

  -9的補碼為11110111。然後三位一划

  111---->7

  110---->6

  011---->3

  然後我們將結果按從下往上的順序書寫就是:367,那麼367就是十進位數-9的八進位形式。

  補充:

  最近有些朋友提了這樣的問題「0.8的十六進位是多少?」

  我想在我的空間裡已經有了詳細的講解,為什麼他還要問這樣的問題那

  於是我就動手算了一下,發現0.8、0.6、0.2... ...一些數字在進位之間的轉化

  過程中確實存在麻煩。

  就比如「0.8的十六進位」吧!

  無論你怎麼乘以16,它的餘數總也乘不盡,總是餘8

  這可怎麼辦啊,我也沒轍了

  第二天,我請教了我的老師才知道,原來這麼簡單啊!

  具體方法如下:

  0.8*16=12.8

  0.8*16=12.8

  .

  .

  .

  .

  .

  取每一個結果的整數部分為12既十六進位的C

  如果題中要求精確到小數點後3位那結果就是0.CCC

  如果題中要求精確到小數點後4位那結果就是0.CCCC

  現在OK了,我想我的朋友再也不會因為進位的問題煩愁了!

  下面是將十進位數轉換為負R進位的公式:

  N=(dmdm-1...d1d0)-R

  =dm*(-R)^m+dm-1*(-R)^m-1+...+d1*(-R)^1+d0*(-R)^0

  15=1*(-2)^4+0*(-2)^3+0*(-2)^2+1*(-2)^1+1*(-2)^0

  =10011(-2)

  其實轉化成任意進位都是一樣的

  初學者最容易犯的錯誤!!!!!!!

  犯錯:(-617)D=(-1151)O=(-269)H

  原因分析:如果是正數的話,上面的思路是正確的,但是由於正數和負數在原碼、反碼、補碼轉換上的差別,所以按照正數的求解思路去對負數進行求解是不對的。

  正確的方法是:首先將-617用補碼表示出來,然後再轉換成八進位和十六進位(補碼)即可。

  註:二進位補碼要用16位。

  正確答案::(-617)D=(176627)O=(fd97)H

  負數十進位轉換成八進位或十六進位方法

  如(-12)10=( )8=( )16

  第一步:轉換成二進位

  1000 0000 0000 1100

  第二步:補碼,取反加一 

  注意:取反時符號位不變! 

  1111 1111 1111 0100

  第三步:轉換成八進位是三位一結合:(177764)8

單片機相關文章:單片機教程

c++相關文章:c++教程

單片機相關文章:單片機視頻教程

單片機相關文章:單片機工作原理


相關焦點

  • 大話二進位,八進位,十進位,十六進位之間的轉換
    4.二進位轉換首先來看十進位到二進位:除2取餘數 最後把餘數倒過來 100101比如:十進位數375.八進位轉換十進位到八進位:除8取餘數 最後把餘數倒過來同時我們也可以先將十進位轉換成二進位,然後將二進位又轉換成八進位比如:2456 轉化成八進位數字:46302456/8=307,餘0;307/8=38,餘3;38/8=4,餘6;4/8=0,餘4。
  • 經緯度十進位與六十進位轉換
    工作有時候經常要用到經緯度轉換這個功能,十進位與度分秒之間轉換如下:度分秒之間的關係式為1度=60分
  • 嵌入式單片機基礎-十六進位,天生的輔助型英雄
    在生活中,絕大部分人喜歡用十進位;但是在處理器的心裡只有二進位。如果我們寫代碼想要配置某個寄存器,通過參考手冊直接得到一般都是和這個寄存器匹配的一組二進位序列。如果我們在代碼中把這個二進位序列以二進位的形式寫出來,那是相當麻煩的一件事情。
  • C語言常用的進位轉換工具函數盤點!爺爺再也不用擔心我不會進位...
    01 字符串轉十六進位 代碼實現: 04 十進位轉字符串 如果只是單個十進位轉字符串,使用sprintf函數就可以了。 如果是十進位數組:
  • 問1得10:shell十進位轉換到任意進位,多大事兒,一行搞定!
    引言引言Bash編程中,我們一般不需要把字符串格式化為十六進位。因為,十進位是給人類看的,而16進位則用於存儲到計算機。本文通過編程實踐中所遇到的困難,引出進位轉換的問題。然後給出解決方案。其中,格式化字符串,所用的元字符非常有用。
  • 小白基礎知識必備|整型常量與進位間的轉換
    ◎十進位整數十進位整數常量不需要在前面加前綴,十進位所包含數字0-9如:num = 12345;◎八進位常量常量前面加0作為前綴,八進位所包含數字是0 - 7之間如:num1 = 0127;◎十六進位常量常量前面加0x作為前綴,十六進位包含的數字0 - 9以及字母A-F,也可以小寫形式。
  • 單片機實例分享,自製數字示波器
    繼電器K1~K5工作狀態受單片機控制,所以垂直輸入電路是一個程控放大器。垂直靈敏度和K1~K5工作狀態的對應關係見表22.1(1表示閉合,0表示斷開)。2. A/D 轉換電路我們知道,A/D轉換電路的作用就是將模擬信號數位化。一般把實現連續信號到離散信號的過程叫採樣。連續信號經過採樣和量化後才能被單片機處理。
  • 高手講解PIC單片機:從管腳到指令,一看就懂
    單片機正常運行時接高電平。當有一個低電平脈衝輸入到這個腳時單片機就復位。所謂復位就是單片機內部所有的工作部件統統回到規定的狀態,程序也復位到頭一句上開始逐條運行。例如,你設計的一個報警鎖定的 LED紅燈亮後,當需要解除報警時,用一個按鈕給這個腳瞬時接地一下,相當於給它一個夫脈衝,系統就復位了,led燈就熄滅了,程序從頭開始。
  • 二進位小總結
    比如說對使用1個字節存儲的數進行計算或者傳輸,那麼這個數所能表示的最小值為00000000最大值為11111111,轉換為十進位為0 ~ 255。那麼無論對這個數做了什麼計算,無論計算之後的結果為多少都不能超出這個範圍,同理使用2個字節存儲的數範圍為0 ~ 65535。
  • 80C51單片機的基本結構
    1) 中央處理器(CPU)中央處理器是單片機的核心,完成運算和控制功能。MCS-51的CPU能處理8位二進位數或代碼。
  • 基於單片機的萬年曆設計
    1.2 系統基本方案選擇  1.2.1 單片機  系統的單片機採用高性能、低功耗的AVRATmegal28L微控制器。系統利用4個外部中斷接4個獨立式按鍵來進行參數、功能的設置,蜂鳴器用來整點提示和鬧鈴提示。程序下載可通過預留ISP接口方便地對系統軟體進行升級、添加或裁剪系統功能。
  • 如何讓文科女朋友輕鬆認識二進位數?
    進位即進位制。進位制是一種計數方式,可以用有限的記數符號代表所有的數值。我們常用的進位包括:二進位、八進位、十進位與十六進位,它們之間區別在於數運算時是逢幾進一位。比如我們常用的十進位就是由數字0-9組成,逢十進一位。同理,二進位數是用0和1兩個數碼來表示的數,它的基數為2,則逢二進一位。
  • 以STC89C52單片機為核心的電子密碼鎖設計
    以STC89C52單片機為核心的電子密碼鎖設計 工程師黃明星 發表於 2018-08-16 17:38:23 引言 電子密碼鎖是現代生活中常用的加密工具。
  • 使用Swing製作進位轉化器
    進位轉化1.各進位之間的轉化在計算機科學中,常用的進位有二進位、八進位、十進位和十六進位。在開發過程中使用比較多的是二進位和十進位的。如果涉及一些字節編碼操作,十六進位也會用得到,甚至可能會用到三十二進位。1.1 十進位向其它進位轉化以正常的十進位數為標準,如果將一個十進位數轉化成二進位數。可以使用除法取餘的方式進行,在下圖中我們用二進位和八進位進行舉例:
  • 光耦在單片機控制系統中的應用
    隔離電路的目的隔離電路的主要目的,是將兩個系統之間的電氣連接關係通過「電光-光電」轉換器件,或者「電磁-磁電」轉換器件來切斷。所謂電氣系統的切斷,即不僅指控制信號的隔離,同樣也是指兩個部分的「地」信號完完全全隔離開來。
  • C/C+編程筆記:C語言進位詳解,二進位、八進位和十六進位!
    進行加法運算時逢X進一(滿X進一),進行減法運算時借一當X,這就是X進位,這種進位也就包含X個數字,基數為X。十進位有 0~9 共10個數字,基數為10,在加減法運算中,逢十進一,借一當十。 在計算機內部,數據都是以二進位的形式存儲的,二進位是學習編程必須掌握的基礎。本節我們先講解二進位的概念,下節講解數據在內存中的存儲,讓大家學以致用。
  • 電工必學:PLC與單片機的本質區別是什麼?
    PLC與單片機的本質區別是什麼? PLC與單片機的差別是: 1、PLC是應用單片機構成的比較成熟的控制系統,是已經調試成熟穩定的單片機應用系統的產品。有較強的通用性。
  • 【愛找茬】都是C語言,單片機C語言和普通的C語言究竟有什麼差異呢?
    許多小夥伴在學完C語言後想入門單片機,但學著學著發現明明都是C語言,為什麼單片機C語言和我當初學的C語言有差異呢?今天小編就來梳理我們平時所學的C語言與單片機C語言的有什麼樣的不同。
  • 青少年AI測試考級系列之——你知道計算機採用的是什麼進位系統?
    所謂進位系統,就是一種計數的方式。人類創造了文字、阿拉伯數字,進而設定了十進位的計數方式,才不斷演變至今,有了我們的現代文明以及數字科技時代。人類採用的是十進位的計數系統,想想為什麼呢?比如:二進位:0、1八進位:0、1、2、3、4、5、6、7、8十進位:0、1、2、3、4、5、6、7、8、92、基數:表示該進位系統的符號的個數。二進位:只有0、1兩個符號。
  • ...和選擇了「二進位」這個開啟人類社會數位化信息化大門的金鑰匙?
    二進位是數學記數系統的一種最簡單的進位,每位數增加到2的時候就向上一位進位,每位上的數字只可能是0和1。這和十進位每位數增加到10的時候向上一位進位,每位上的數字只可能是0、1、2、…、9的道理相同。十進位整數與二進位整數之間的轉換關係如下圖所示。另外在計算機設計中,也用到了二進位的浮點數,因與主題無關,本文無需贅述。