2008-10-28 156 views
54

嘿!我一直在尋找這個代碼在http://www.gnu.org/software/m68hc11/examples/primes_8c-source.html爲什麼使用十六進制?

我注意到,在某些情況下,他們在線路134使用十六進制數字,如:

for (j = 1; val && j <= 0x80; j <<= 1, q++) 

現在他們爲什麼要使用0x80的?我不是十六進制,但我發現了一個十進制在線十六進制,它給了我128個0x80。

還行134之前,線114上他們有這樣的:

small_n = (n & 0xffff0000) == 0; 

十六進制爲十進制給我4294901760爲十六進制數。 因此,在這一行中,他們做了一些AND並將結果與​​0進行比較?

爲什麼不只是使用數字? 任何人都可以請解釋,並請舉例說明其他情況。

此外,我已經看到了大量行代碼,它只是十六進制數,從來沒有真正明白爲什麼:(

回答

103

在你舉兩個例子中,數位模式是很重要的,而不是實際數量。

例如, 在第一種情況, j將是1,則2,4,8,16,32,64和最後128作爲循環進行。

在二元的,即,

0000:00010000:00100000:0100,,0001:0000,0010:0000,0100:00001000:0000

有在C或C++二進制常量沒辦法,但它在十六進制更清楚一點: 0x010x020x040x080x100x200x400x80

在第二個示例中, 的目標是移除該值的較低兩個字節。 因此,如果給定值1,234,567,890,我們最終將以1,234,567,168結束。
在十六進制中,它更清晰:從0x4996:02d2開始,以0x4996:0000結尾。

+2

對第二個例子的小修改:它刪除了一個四字節數字的低兩個字節。刪除較低的四個字節將簡單地爲「small_n = 0;」。 – 2008-10-28 16:36:10

+3

D'Oh!你知道,我正在寫「4位數字」和「兩個字節」之間進行辯論,所以很自然地我把它們混合成了一個錯誤的陳述..... – 2008-10-28 17:18:16

17

它有點掩碼。十六進制值可以很容易地看到底層的二進制表示。 n & 0xffff0000返回n的前16位。 0xffff0000表示「二進制16 1和16 0」

0x80表示「1000000」,所以以「00000001」開頭並繼續將該位移到左邊的「0000010」,「0000100」等直到「1000000」

3

十六進制或十六進制數字表示4位數據,0到15或十六進制數字0到F.兩個十六進制值表示一個字節。

16

0xffff0000很容易理解,它是32位值的16倍「1」和16倍「0」,而4294901760是魔術。

6

有時,HEX中值的可視化表示使代碼更具可讀性或可理解性。例如,在查看數字的十進制表示時,位掩碼或位的使用變得不明顯。

這有時候可以處理特定值類型所提供的空間量,因此也可能發揮作用。

一個典型的例子可能在二進制設置,所以我們使用二進制代替使用十進制來顯示一些值。

比方說,一個對象有一個非排他性的屬性集,其值爲on或off(其中3個) - 表示這些屬性狀態的一種方式是3位。

有效表示法是十進制的0到7,但不是那麼明顯。更明顯的是二進制表示:

000,001,010,011,100,101,110,111

此外,有些人就是很舒服的十六進制。還要注意,硬編碼的魔術數字就是這樣,不管編號系統如何使用都不是那麼重要

我希望有幫助。

1

看着文件,這是一些漂亮的代碼。希望你擅長C而不是將它用作教程...

十六進制對於直接在比特級或正上方工作時很有用。例如,在一個驅動程序上工作,您可以直接從設備進入,並轉換結果,以便其他人可以讀取連貫的結果。這是一個非常容易閱讀的二進制代碼。

+1

這段代碼沒有錯。看看這些代碼,我找不到使用HEX的更清晰的方法。 – Kibbee 2008-10-28 17:31:46

17

在十六進制(或八進制數字)數字和底層位模式之間有一個直接映射,而小數不是這種情況。一個十進制的'9'表示與位模式有所不同,它取決於它所在的列和圍繞它的數字 - 它與位模式沒有直接關係。在十六進制中,'9'總是表示'1001',不管是哪一列。 9 ='1001',95 ='* 1001 * 0101'等等。

作爲我8位天的遺蹟,我發現十六進制對任何二進制文件都是一個方便的簡寫。位扭曲是一種垂死的技能。有一次(大約10年前),我在大學看到了第三年的網絡論文,只有10%(五分之五)的同學可以計算出一個位掩碼。

6

通常使用十六進制數字而不是十進制數字,這是因爲計算機與位(二進制數)一起工作,當使用位時,使用十六進制數字也更容易理解,因爲從十六進制變爲二進制更容易從十進制到二進制。

OxFF = 1111 1111 (F = 1111) 

255 = 1111 1111 

因爲

255/2 = 127 (rest 1) 
127/2 = 63 (rest 1) 
63/2 = 31 (rest 1) 
... etc 

你能看見嗎?從十六進制傳遞到二進制更簡單。

10

我發現C系列語言一直支持八進制和十六進制,但不支持二進制。我一直希望,他們將增加直接支持二進制:

int mask = 0b00001111; 

很多年/工作前,同時,涉及位級的數學的大量項目的工作,我受夠了,併產生了頭其包含針對所有可能的二進制值高達8位定義的常量的文件:

#define b0  (0x00) 
#define b1  (0x01) 
#define b00  (0x00) 
#define b01  (0x01) 
#define b10  (0x02) 
#define b11  (0x03) 
#define b000  (0x00) 
#define b001  (0x01) 
... 
#define b11111110 (0xFE) 
#define b11111111 (0xFF) 

它偶爾取得了一定的位級碼的可讀性。

6

十六進制的最大用途可能是嵌入式編程。十六進制數字用於屏蔽硬件寄存器中的各個位,或將多個數值拆分爲單個8,16或32位寄存器。

當指定單個位掩碼,很多人開始方式:

#define bit_0 1 
#define bit_1 2 
#define bit_2 4 
#define bit_3 8 
#define bit_4 16 
etc... 

一段時間後,他們前進到:

#define bit_0 0x01 
#define bit_1 0x02 
#define bit_2 0x04 
#define bit_3 0x08 
#define bit_4 0x10 
etc... 

然後,他們學會了欺騙,並讓編譯器生成值作爲編譯時優化的一部分:

#define bit_0 (1<<0) 
#define bit_1 (1<<1) 
#define bit_2 (1<<2) 
#define bit_3 (1<<3) 
#define bit_4 (1<<4) 
etc... 
3

更準確地說,十六進制和十進制,ar e全部數字。基數(基數10,16等)是以更清晰或更方便的方式呈現這些數字的方式。

在討論「有多少東西時」我們通常使用小數。當我們在計算機上查看地址或位模式時,十六進制通常是首選的,因爲通常單個字節的含義可能很重要。

十六進制(和八進制)具有它們是二的冪的屬性,所以它們很好地映射了一些位組。十六進制將4位映射到一個十六進制半字節(0-F),因此一個字節存儲在兩個半字節(00-FF)中。 Octal在數字設備(DEC)和其他老式機器上很受歡迎,但是一個八位數字映射到三位,所以它不會像字符邊界那樣很好地跨越。

總體而言,基數的選擇是一種讓您的編程更輕鬆的方法 - 使用最適合該領域的方法。

3

一個字節中有8位。十六進制,十六進制,十分簡潔。任何可能的字節值都使用集合0..9中的兩個字符加上a,b,c,d,e,f來表示。

基數256會更簡潔。每個可能的字節都可以有自己的單個字符,但大多數人類語言不使用256個字符,所以Hex是勝利者。

爲了理解簡潔的重要性,考慮到在20世紀70年代,當你想檢查你的兆字節的內存時,它被打印出十六進制。打印輸出將使用幾千頁大紙。八月會浪費更多的樹木。