2014-09-03 80 views
6

我看了一下爲什麼我們有時使用十進制的十六進制格式?

int a = 0x1; //hexadecimal format 

但是,我找不到爲什麼程序員應該使用爲0x1的原因,0X2而不是純整數1或2的解釋......

可有人請解釋一下?

謝謝。

+0

這樣的數字可能更具邏輯意義(例如'0x0001,0x0010,0x0100,0x1000'而不是'1,16,256,4096')。它也常用於顏色和錯誤代碼。 – Obicere 2014-09-03 03:53:16

+0

我相信這是我回答的問題的重複,[這裏](http://stackoverflow.com/questions/18304564/what-does-this-line-of-code-do-const-uint32-t -goodguys-0x1-0/18317401#18317401)。 – Jashaszun 2014-09-03 03:53:21

+0

@Jashaszun雖然問題材料是相關的,但我覺得這個問題是針對十六進制格式的廣泛使用,而你所鏈接的問題更多地集中在一個特定的情況。儘管如此,我相信你的答案確實能夠解決這個問題。 – Vulcan 2014-09-03 04:04:17

回答

2

實際上沒有什麼區別。我認爲這是基於一致性的考慮。例如,您要指定一些顏色,如0xffffff,0xab32,0x13和0x1,這些顏色一致且易於閱讀。

+0

以十六進制表示的顏色確實比以小數表示的+1好得多。 – Vulcan 2014-09-03 03:55:49

4

我使用過自己的一個原因是,它涉及到標誌時,它在組織上/視覺上(即,在將代碼放在代碼中時對人有幫助)。

int a = 0x1; 
int b = 0x2; 
int c = 0x4; 
int d = 0x8; 
int e = 0x10; 

等。那些可以更整齊地按位「或」運算。例如,上述所有按位「或」都是0X1F,即二進制中的11111或單獨的二進制字段。

然後,如果我想刪除一個標誌我按位 - 異或它了。

0x1F的XOR位於0x8 = 10111

+0

我相信你的意思是0x10爲0x16?而0x16異或0x8不會刪除任何位,因爲它們沒有共同的位。 – user949300 2014-09-03 04:00:26

+0

@ user949300:是的,謝謝。 – khampson 2014-09-03 04:01:36

4

有許多的原因之一寧願十六進制表示在十進制之一。計算中最常見的是bit fields。有幾個人已經提到的顏色代碼,如:

red = 0xFF0000 // 16711680 in decimal 
green = 0x00FF00 // 65280 in decimal 
blue = 0x0000FF // 255 in decimal 

注意顏色的這種表現不僅比試圖找出像213545的隨機整數可能是什麼顏色更加直觀,而且還佔用更少的空間比像(125, 255, 0)這樣的3元組代表(R,G,B)。十六進制表示法是一種簡單的方法,它可以抽象出與三元組相同的想法,並且開銷較小。

記住位域有很多應用,考慮spacetime位字段:

Represents x coordinate 
    | Represents y coordinate 
    | | Represents z coordinate 
    | | | Represents t 
    | | | | 
    1A 2B 3C 4D 

爲什麼有人可能會使用十六進制值的另一個原因是因爲它有時更容易記住(並代表)的二進制位數爲兩個符號而不是三個。考慮x86 Instruction Reference。我知道我的頭頂那0xC3ret;我發現很容易記住十六進制數00-FF而不是小數點0-255(我查了一下,並且ret最後是195),但是你的里程可能會有所不同。例如,這是一些代碼from a project我一直在努力:

public class x64OpcodeMapping { 
    public static final Object[][] map = new Object[][] { 
      { "ret", 0xC3 }, 
      { "iret", 0xCF }, 
      { "iretd", 0xCF }, 
      { "iretq", 0xCF }, 
      { "nop" , 0x90 }, 
      { "inc" , 0xFF }, 
    }; 
} 

有明顯的好處在這裏使用十六進制符號時(更不用說一致性)。最後,正如Obicere所說,十六進制代碼通常用作錯誤代碼。有時候他們有點像田野般的方式。例如:

0x0X = fatal errors 
0x1X = user errors 
0x2X = transaction errors 
// ... 
// X is a wildcard 

在這樣一個模式,一個最小的錯誤列表看起來像:

0x00 = reserved 
0x01 = hash mismatch 
0x02 = broken pipe 
0x10 = user not found 
0x11 = user password invalid 
0x20 = payment method invalid 
// ... 

注意,這也讓我們0x0X下添加新的錯誤,如果這種需要就會出現。這個答案最終比我預期的時間長得多,但希望我可以點亮一些。