二進制,十六進制,八進制的換算

字號:

0,16,2進制的互相轉(zhuǎn)換
     所謂16進制,就是由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16個數(shù)字組成。逢16進一位,下面就講講在沒有任何工具的情
    況下如何將一10進制轉(zhuǎn)化為16進制:
     1000除以16得62余8,那么低位為8,再將62除以16得3余14,那么倒數(shù)第2為E(14對于16進制來說是E),3比16小了,所以不用繼續(xù)除了
    ,總的就是3E8,為1000的16進制數(shù)。
     想要將16進制的數(shù)轉(zhuǎn)化為10進制,只需將上面的步驟反過來做就可以了。不用我多說吧!
     2進制僅由0、1兩個數(shù)字組成,逢1進一。要將一10進制化為2進制,介紹一個簡單的方法,先將10進制的數(shù)化為16進制,再化為2進制,舉
    個例子:
     515對應16進制為203H,將203轉(zhuǎn)為2進制則為0010(2) 0000(0) 0011(3),一個位數(shù)對2進制來說是4個字符。0H就是0000、1H就是
    0001、……、0EH就是1110、OFH為1111,大家可自己推一下。
     總之大家一定要熟練掌握各個進制的互相轉(zhuǎn)化,尤其是100以內(nèi)10--16和16--10的互相轉(zhuǎn)化要記住。
     16-10H、32-20H、48-30H、64-40H、80-50H、96-60H、100-64H,255-FFH,65535-FF FFH,1677萬-FF FF FFH,前為10進制,后有H的為16
    進制,這些能記住好,以后修改就方便許多了。
    二進制
    二進制是逢2進位的進位制,0、1是基本算符。
    現(xiàn)代的電子計算機技術全部采用的是二進制,因為它只使用0、1兩個數(shù)字符號,非常簡單方便,易于用電子方式實現(xiàn)。
    二進制四則運算規(guī)則
    加法  0+0=0,0+1=1+0=1,1+1=10
    減法  0-0=0,1-0=1,1-1=0,0-1=-1
    乘法  0×0=0,0×1=1×0=0,1×1=1
    除法  0÷1=0,1÷1=1
    一、什么是二進制
    在現(xiàn)實生活和記數(shù)器中,如果表示數(shù)的“器件”只有兩種狀態(tài),如電燈的“亮”與“滅”,開關的“開”與“關”。一種狀態(tài)表示數(shù)碼0,另一種狀態(tài)表示數(shù)碼1,1加1應該等于2,因為沒有數(shù)碼2,只能向上一個數(shù)位進一,就是采用“滿二進一”的原則,這和十進制是采用“滿十進一”原則完全相同。
    1+1=10,10+1=11,11+1=100,100+1=101,
    101+1=110,110+1=111,111+1+=1000,……,
    可見二進制的10表示二,100表示四,1000表示八,10000表示十六,……。
    二進制同樣是“位值制”。同一個數(shù)碼1,在不同數(shù)位上表示的數(shù)值是不同的。如11111,從右往左數(shù),第一位的1就是一,第二位的1表示二,第三位的1表示四,第四位的1表示八,第五位的1表示十六。用大家熟悉的十進制說明這個二進制數(shù)的含意,有以下關系式
    (11111)(二進制)=1×24+1×23+1×22+1×2+1(十進制)
    一個二進制整數(shù),從右邊第一位起,各位的計數(shù)單位分別是1,2,22,23,…,2n,…。
    1為什么需要八進制和十六進制?
    編程中,我們常用的還是10進制……必竟C/C++是高級語言。
    比如:
    int a = 100,b = 99;
    不過,由于數(shù)據(jù)在計算機中的表示,終以二進制的形式存在,所以有時候使用二進制,可以更直觀地解決問題。
    但,二進制數(shù)太長了。比如int 類型占用4個字節(jié),32位。比如100,用int類型的二進制數(shù)表達將是:
    0000 0000 0000 0000 0110 0100
    面對這么長的數(shù)進行思考或操作,沒有人會喜歡。因此,C,C++ 沒有提供在代碼直接寫二進制數(shù)的方法。
    用16進制或8進制可以解決這個問題。因為,進制越大,數(shù)的表達長度也就越短。不過,為什么偏偏是16或8進制,而不其它的,諸如9或20進制呢?
    2、8、16,分別是2的1次方,3次方,4次方。這一點使得三種進制之間可以非常直接地互相轉(zhuǎn)換。8進制或16進制縮短了二進制數(shù),但保持了二進制數(shù)的表達特點。在下面的關于進制轉(zhuǎn)換的課程中,你可以發(fā)現(xiàn)這一點。
    6.2 二、八、十六進制數(shù)轉(zhuǎn)換到十進制數(shù)
    6.2.1 二進制數(shù)轉(zhuǎn)換為十進制數(shù)
    二進制數(shù)第0位的權值是2的0次方,第1位的權值是2的1次方……
    所以,設有一個二進制數(shù):0110 0100,轉(zhuǎn)換為10進制為:
    下面是豎式:
    0110 0100 換算成 十進制
    第0位 0 * 20 = 0
    第1位 0 * 21 = 0
    第2位 1 * 22 = 4
    第3位 0 * 23 = 0
    第4位 0 * 24 = 0
    第5位 1 * 25 = 32
    第6位 1 * 26 = 64
    第7位 0 * 27 = 0 +
    ---------------------------
     100
    用橫式計算為:
    0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100
    0乘以多少都是0,所以我們也可以直接跳過值為0的位:
    1 * 22 + 1 * 23 + 1 * 25 + 1 * 26 = 100
    6.2.2 八進制數(shù)轉(zhuǎn)換為十進制數(shù)
    八進制就是逢8進1。
    八進制數(shù)采用 0~7這八數(shù)來表達一個數(shù)。
    八進制數(shù)第0位的權值為8的0次方,第1位權值為8的1次方,第2位權值為8的2次方……
    所以,設有一個八進制數(shù):1507,轉(zhuǎn)換為十進制為:
    用豎式表示:
    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
    結(jié)果是,八進制數(shù) 1507 轉(zhuǎn)換成十進制數(shù)為 839
    6.2.3 八進制數(shù)的表達方法
    C,C++語言中,如何表達一個八進制數(shù)呢?如果這個數(shù)是 876,我們可以斷定它不是八進制數(shù),因為八進制數(shù)中不可能出7以上的阿拉伯數(shù)字。但如果這個數(shù)是123、是567,或12345670,那么它是八進制數(shù)還是10進制數(shù),都有可能。
    所以,C,C++規(guī)定,一個數(shù)如果要指明它采用八進制,必須在它前面加上一個0,如:123是十進制,但0123則表示采用八進制。這就是八進制數(shù)在C、C++中的表達方法。
    由于C和C++都沒有提供二進制數(shù)的表達方法,所以,這里所學的八進制是我們學習的,CtC++語言的數(shù)值表達的第二種進制法。
    現(xiàn)在,對于同樣一個數(shù),比如是100,我們在代碼中可以用平常的10進制表達,例如在變量初始化時:
    int a = 100;
    我們也可以這樣寫:
    int a = 0144; //0144是八進制的100;一個10進制數(shù)如何轉(zhuǎn)成8進制,我們后面會學到。
    千萬記住,用八進制表達時,你不能少了前的那個0。否則計算機會通通當成10進制。不過,有一個地方使用八進制數(shù)時,卻不能使用加0,那就是我們前面學的用于表達字符的“轉(zhuǎn)義符”表達法。
    6.2.4 八進制數(shù)在轉(zhuǎn)義符中的使用
    我們學過用一個轉(zhuǎn)義符'\'加上一個特殊字母來表示某個字符的方法,如:'\n'表示換行(line),而'\t'表示Tab字符,'\''則表示單引號。今天我們又學習了一種使用轉(zhuǎn)義符的方法:轉(zhuǎn)義符'\'后面接一個八進制數(shù),用于表示ASCII碼等于該值的字符。
    比如,查一下第5章中的ASCII碼表,我們找到問號字符(?)的ASCII值是63,那么我們可以把它轉(zhuǎn)換為八進值:77,然后用 '\77'來表示'?'。由于是八進制,所以本應寫成 '\077',但因為C,C++規(guī)定不允許使用斜杠加10進制數(shù)來表示字符,所以這里的0可以不寫。
    事實上我們很少在實際編程中非要用轉(zhuǎn)義符加八進制數(shù)來表示一個字符,所以,6.2.4小節(jié)的內(nèi)容,大家僅僅了解就行。
    6.2.5 十六進制數(shù)轉(zhuǎn)換成十進制數(shù)
    2進制,用兩個阿拉伯數(shù)字:0、1;
    8進制,用八個阿拉伯數(shù)字:0、1、2、3、4、5、6、7;
    10進制,用十個阿拉伯數(shù)字:0到9;
    16進制,用十六個阿拉伯數(shù)字……等等,阿拉伯人或說是印度人,只發(fā)明了10個數(shù)字???
    16進制就是逢16進1,但我們只有0~9這十個數(shù)字,所以我們用A,B,C,D,E,F(xiàn)這五個字母來分別表示10,11,12,13,14,15。字母不區(qū)分大小寫。
    十六進制數(shù)的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方……
    所以,在第N(N從0開始)位上,如果是是數(shù) X (X 大于等于0,并且X小于等于 15,即:F)表示的大小為 X * 16的N次方。
    假設有一個十六進數(shù) 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)
    現(xiàn)在可以看出,所有進制換算成10進制,關鍵在于各自的權值不同。
    假設有人問你,十進數(shù) 1234 為什么是 一千二百三十四?你盡可以給他這么一個算式:
    1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100
    6.2.6 十六進制數(shù)的表達方法
    如果不使用特殊的書寫形式,16進制數(shù)也會和10進制相混。隨便一個數(shù):9876,就看不出它是16進制或10進制。
    C,C++規(guī)定,16進制數(shù)必須以 0x開頭。比如 0x1表示一個16進制數(shù)。而1則表示一個十進制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不區(qū)分大小寫。(注意:0x中的0是數(shù)字0,而不是字母O)
    以下是一些用法示例:
    int a = 0x100F;
    int b = 0x70 + a;
    至此,我們學完了所有進制:10進制,8進制,16進制數(shù)的表達方式。后一點很重要,C/C++中,10進制數(shù)有正負之分,比如12表示正12,而-12表示負12,;但8進制和16進制只能用達無符號的正整數(shù),如果你在代碼中里:-078,或者寫:-0xF2,C,C++并不把它當成一個負數(shù)。
    6.2.7 十六進制數(shù)在轉(zhuǎn)義符中的使用
    轉(zhuǎn)義符也可以接一個16進制數(shù)來表示一個字符。如在6.2.4小節(jié)中說的 '?' 字符,可以有以下表達方式:
    '?' //直接輸入字符
    '\77' //用八進制,此時可以省略開頭的0
    '\0x3F' //用十六進制
    同樣,這一小節(jié)只用于了解。除了空字符用八進制數(shù) '\0' 表示以外,我們很少用后兩種方法表示一個字符。
    6.3 十進制數(shù)轉(zhuǎn)換到二、八、十六進制
    6.3.1 10進制數(shù)轉(zhuǎn)換為2進制數(shù)
    給你一個十進制,比如:6,如果將它轉(zhuǎn)換成二進制數(shù)呢?
    10進制數(shù)轉(zhuǎn)換成二進制數(shù),這是一個連續(xù)除2的過程:
    把要轉(zhuǎn)換的數(shù),除以2,得到商和余數(shù),
    將商繼續(xù)除以2,直到商為0。后將所有余數(shù)倒序排列,得到數(shù)就是轉(zhuǎn)換結(jié)果。
    聽起來有些糊涂?我們結(jié)合例子來說明。比如要轉(zhuǎn)換6為二進制數(shù)。
    “把要轉(zhuǎn)換的數(shù),除以2,得到商和余數(shù)”。
     那么:
     要轉(zhuǎn)換的數(shù)是6, 6 ÷ 2,得到商是3,余數(shù)是0。 (不要告訴我你不會計算6÷3?。?BR>    “將商繼續(xù)除以2,直到商為0……”
    現(xiàn)在商是3,還不是0,所以繼續(xù)除以2。
    那就: 3 ÷ 2, 得到商是1,余數(shù)是1。
    “將商繼續(xù)除以2,直到商為0……”
    現(xiàn)在商是1,還不是0,所以繼續(xù)除以2。
    那就: 1 ÷ 2, 得到商是0,余數(shù)是1 (拿筆紙算一下,1÷2是不是商0余1!)
    “將商繼續(xù)除以2,直到商為0……后將所有余數(shù)倒序排列”
    好極!現(xiàn)在商已經(jīng)是0。
    我們?nèi)斡嬎阋来蔚玫接鄶?shù)分別是:0、1、1,將所有余數(shù)倒序排列,那就是:110了!
    6轉(zhuǎn)換成二進制,結(jié)果是110。
    把上面的一段改成用表格來表示,則為:
    被除數(shù) 計算過程 商 余數(shù)
    6 6/2 3 0
    3 3/2 1 1
    1 1/2 0 1
    (在計算機中,÷用 / 來表示)
    如果是在考試時,我們要畫這樣表還是有點費時間,所更常見的換算過程是使用下圖的連除:
    請大家對照圖,表,及文字說明,并且自已拿筆計算一遍如何將6轉(zhuǎn)換為二進制數(shù)。
    說了半天,我們的轉(zhuǎn)換結(jié)果對嗎?二進制數(shù)110是6嗎?你已經(jīng)學會如何將二進制數(shù)轉(zhuǎn)換成10進制數(shù)了,所以請現(xiàn)在就計算一下110換成10進制是否就是6。
    6.3.2 10進制數(shù)轉(zhuǎn)換為8、16進制數(shù)
    非常開心,10進制數(shù)轉(zhuǎn)換成8進制的方法,和轉(zhuǎn)換為2進制的方法類似,惟一變化:除數(shù)由2變成8。
    來看一個例子,如何將十進制數(shù)120轉(zhuǎn)換成八進制數(shù)。
    用表格表示:
    被除數(shù) 計算過程 商 余數(shù)
    120 120/8 15 0
    15 15/8 1 7
    1 1/8 0 1
    120轉(zhuǎn)換為8進制,結(jié)果為:170。
    非常非常開心,10進制數(shù)轉(zhuǎn)換成16進制的方法,和轉(zhuǎn)換為2進制的方法類似,惟一變化:除數(shù)由2變成16。
    同樣是120,轉(zhuǎn)換成16進制則為:
    被除數(shù) 計算過程 商 余數(shù)
    120 120/16 7 8
    7 7/16 0 7
    120轉(zhuǎn)換為16進制,結(jié)果為:78。
    請拿筆紙,采用(圖:1)的形式,演算上面兩個表的過程。