大學(xué)講過确憨,忘完了氧猬,搜下資料記錄了下
概念:
以0x開始的數(shù)據(jù)表示16進(jìn)制怀伦,計(jì)算機(jī)中每位的權(quán)為16,即(16進(jìn)制)10 = (10進(jìn)制)1×16
備注:這里的0是數(shù)字0凡恍,不是字母O志秃!
為什么需要十六進(jìn)制
編程中,我們常用的還是10進(jìn)制……畢竟C/C++是高級語言嚼酝。
比如:
int a = 100,b = 99;
不過浮还,由于數(shù)據(jù)在計(jì)算機(jī)中的表示,最終以二進(jìn)制的形式存在革半,所以有時(shí)候使用二進(jìn)制碑定,可以更直觀地解決問題。
但又官,二進(jìn)制數(shù)太長了。比如int 類型占用4個(gè)字節(jié)漫试,32位六敬。比如100,用int類型的二進(jìn)制數(shù)表達(dá)將是:
0000 0000 0000 0000 0000 0000 0110 0100
面對這么長的數(shù)進(jìn)行思考或操作驾荣,沒有人會(huì)喜歡外构。因此,C,C++ 沒有提供在代碼直接寫二進(jìn)制數(shù)的方法播掷。
用16進(jìn)制或8進(jìn)制可以解決這個(gè)問題审编。因?yàn)椋?strong>進(jìn)制越大,數(shù)的表達(dá)長度也就越短歧匈。不過垒酬,為什么偏偏是16或8進(jìn)制,而不其它的件炉,諸如9或20進(jìn)制呢勘究?
2、8斟冕、16口糕,分別是2的1次方,3次方磕蛇,4次方景描。這一點(diǎn)使得三種進(jìn)制之間可以非常直接地互相轉(zhuǎn)換。8進(jìn)制或16進(jìn)制縮短了二進(jìn)制數(shù)秀撇,但保持了二進(jìn)制數(shù)的表達(dá)特點(diǎn)超棺。在下面的關(guān)于進(jìn)制轉(zhuǎn)換的課程中,你可以發(fā)現(xiàn)這一點(diǎn)捌袜。
十六進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)
2進(jìn)制说搅,用兩個(gè)阿拉伯?dāng)?shù)字:0、1虏等;
8進(jìn)制弄唧,用八個(gè)阿拉伯?dāng)?shù)字:0适肠、1、2候引、3侯养、4、5澄干、6逛揩、7;
10進(jìn)制麸俘,用十個(gè)阿拉伯?dāng)?shù)字:0到9辩稽;
16進(jìn)制,用十六個(gè)阿拉伯?dāng)?shù)字……等等从媚,阿拉伯人或說是印度人逞泄,只發(fā)明了10個(gè)數(shù)字啊拜效?
16進(jìn)制就是逢16進(jìn)1喷众,但我們只有0~9這十個(gè)數(shù)字,所以我們用A紧憾,B到千,C,D赴穗,E憔四,F(xiàn)這六個(gè)字母來分別表示10,11望抽,12加矛,13,14煤篙,15斟览。字母不區(qū)分大小寫。
十六進(jìn)制數(shù)的第0位的權(quán)值為16的0次方辑奈,第1位的權(quán)值為16的1次方苛茂,第2位的權(quán)值為16的2次方……
所以,在第N(N從0開始)位上鸠窗,如果是是數(shù) X (X 大于等于0妓羊,并且X小于等于 15,即:F)表示的大小為 X * 16的N次方稍计。
假設(shè)有一個(gè)十六進(jìn)數(shù) 2AF5, 那么如何換算成10進(jìn)制呢躁绸?
用豎式計(jì)算:
2AF5換算成10進(jìn)制:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2 = 2560
第3位: 2 * 16^3 = 8192 +
10997
直接計(jì)算就是:
5 * 16^0 + F * 16^1 + A * 16^2+2 * 16^3 = 10997[1]
(別忘了,在上面的計(jì)算中,A表示10净刮,而F表示15)
十六進(jìn)制數(shù)的表達(dá)方法
如果不使用特殊的書寫形式剥哑,16進(jìn)制數(shù)也會(huì)和10進(jìn)制相混。隨便一個(gè)數(shù):9876淹父,就看不出它是16進(jìn)制或10進(jìn)制株婴。
C,C++規(guī)定暑认,16進(jìn)制數(shù)必須以 0x開頭困介。比如 0x1表示一個(gè)16進(jìn)制數(shù)。而1則表示一個(gè)十進(jìn)制蘸际。另外如:0xff,0xFF,0X102A,等等座哩。其中的x也不區(qū)分大小寫。(注意:0x中的0是數(shù)字0粮彤,而不是字母O)
以下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
至此八回,我們學(xué)完了所有進(jìn)制:10 進(jìn)制,8進(jìn)制驾诈,16進(jìn)制數(shù)的表達(dá)方式。最后一點(diǎn)很重要溶浴,C/C++中乍迄,10進(jìn)制數(shù)有正負(fù)之分,比如12表示正12士败,而-12表示負(fù)12闯两,;但8進(jìn)制和16進(jìn)制只能用來表示無符號的正整數(shù)谅将,如果你在代碼中里:-078漾狼,或者寫:-0xF2,C,C++并不把它當(dāng)成一個(gè)負(fù)數(shù)。
十六進(jìn)制數(shù)互相轉(zhuǎn)換
二進(jìn)制和十六進(jìn)制的互相轉(zhuǎn)換比較重要饥臂。不過這二者的轉(zhuǎn)換卻不用計(jì)算逊躁,每個(gè)C,C++程序員都能做到看見二進(jìn)制數(shù)隅熙,直接就能轉(zhuǎn)換為十六進(jìn)制數(shù)稽煤,反之亦然。
我們也一樣囚戚,只要學(xué)完這一小節(jié)酵熙,就能做到。
首先我們來看一個(gè)二進(jìn)制數(shù):1111驰坊,它是多少呢匾二?
你可能還要這樣計(jì)算:1 * 2 ^0+ 1 * 2^1 + 1 * 2^2+ 1 * 2^3 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。
然而,由于1111才4位察藐,所以我們必須直接記住它每一位的權(quán)值皮璧,并且是從高位往低位記,:8转培、4恶导、2、1浸须。即惨寿,最高位的權(quán)值為 8,然后依次是 4删窒,2裂垦,1。
記住8421肌索,對于任意一個(gè)4位的二進(jìn)制數(shù)蕉拢,我們都可以很快算出它對應(yīng)的10進(jìn)制值。
下面列出四位二進(jìn)制數(shù) xxxx 所有可能的值(中間略過部分)
僅4位的2進(jìn)制數(shù) 快速計(jì)算方法 十進(jìn)制值 十六進(jìn)值
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 + 0 + 2 + 1 = 11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 9 9
....
0001 = 0 + 0 + 0 + 1 = 1 1
0000 = 0 + 0 + 0 + 0 = 0 0
二進(jìn)制數(shù)要轉(zhuǎn)換為十六進(jìn)制诚亚,就是以4位一段晕换,分別轉(zhuǎn)換為十六進(jìn)制
如(上行為二制數(shù),下面為對應(yīng)的十六進(jìn)制):
1111 1101 站宗, 1010 0101 闸准, 1001 1011
F D , A 5 梢灭, 9 B
反過來夷家,當(dāng)我們看到 FD時(shí),如何迅速將它轉(zhuǎn)換為二進(jìn)制數(shù)呢敏释?
先轉(zhuǎn)換F:
看到F库快,我們需知道它是15(可能你還不熟悉A~F這五個(gè)數(shù)),然后15如何用8421湊呢钥顽?應(yīng)該是8 + 4 + 2 + 1义屏,所以四位全為1 :1111。
接著轉(zhuǎn)換 D:
看到D耳鸯,知道它是13湿蛔,13如何用8421湊呢?應(yīng)該是:8 + 4 + 1,即:1101县爬。
所以,FD轉(zhuǎn)換為二進(jìn)制數(shù)阳啥,為: 1111 1101
由于十六進(jìn)制轉(zhuǎn)換成二進(jìn)制相當(dāng)直接,所以财喳,我們需要將一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換成2進(jìn)制數(shù)時(shí)察迟,也可以先轉(zhuǎn)換成16進(jìn)制斩狱,然后再轉(zhuǎn)換成2進(jìn)制。
比如扎瓶,十進(jìn)制數(shù) 1234轉(zhuǎn)換成二制數(shù)所踊,如果要一直除以2,直接得到2進(jìn)制數(shù)概荷,需要計(jì)算較多次數(shù)秕岛。所以我們可以先除以16,得到16進(jìn)制數(shù):
被除數(shù) | 計(jì)算過程 | 商 | 余數(shù) |
---|---|---|---|
1234 | 1234/16 | 77 | 2 |
77 | 77/16 | 4 | 13 (D) |
4 | 4/16 | 0 | 4 |
結(jié)果16進(jìn)制為: 0x4D2
然后我們可直接寫出0x4D2的二進(jìn)制形式:0100 1101 0010误证。
其中對映關(guān)系為:
0100 -- 4
1101 -- D
0010 -- 2
同樣继薛,如果一個(gè)二進(jìn)制數(shù)很長,我們需要將它轉(zhuǎn)換成10進(jìn)制數(shù)時(shí)愈捅,除了前面學(xué)過的方法是遏考,我們還可以先將這個(gè)二進(jìn)制轉(zhuǎn)換成16進(jìn)制,然后再轉(zhuǎn)換為10進(jìn)制蓝谨。
下面舉例一個(gè)int類型的二進(jìn)制數(shù):
01101101 11100101 10101111 00011011
我們按四位一組轉(zhuǎn)換為16進(jìn)制: 6D E5 AF 1B
字節(jié)灌具、比特、十六進(jìn)制
一個(gè)字節(jié)八個(gè)比特,就是八個(gè)二進(jìn)制位 0000 0000 0x00-0xFF (十進(jìn)制0-255)
四個(gè)二進(jìn)制數(shù)最大表示為15,就是一個(gè)16進(jìn)制數(shù),所以八位可以表示成兩個(gè)16進(jìn)制的數(shù)
換句話說:一個(gè)字節(jié)就是兩個(gè)十六進(jìn)制數(shù)