2011-06-30 57 views
18

最近我遇到這樣的一條線對於整數變量使用0x01而不是1的好處?

public final static int DELETION_MASK = 0x01;

爲什麼不喜歡

公共最後靜態INT DELETION_MASK = 1;

使用除0xA以外的第一種方法是否有優勢,並且上限十六進制可以輕鬆轉換?在這種情況下,它只是一個代表1的常量。

+0

它是一種常見的可讀性約定的面具,這似乎是,請參見http://計算器.com/questions/243712 /爲什麼使用十六進制(它的C + +但相同的基本原理) –

回答

20

儘管編譯器生成的代碼沒有區別,但是位掩碼傳統上使用十六進制表示法編寫,因爲它對於人類轉換爲二進制形式顯然更容易。另一個常見的約定是在字段長度已知時包含前導零。例如。一個C int場,這是常見的寫:

#define MASK 0x0000ffff 

此外,十六進制常量指示它的可能位掩碼,或者也會莫名其妙地被捲入位運算,並應可能是一個值的程序員特別對待。

作爲獎勵,十六進制符號也可以避免負數的問題:0xffffffff實際上是一個負數(準確地說是-1)。而不是與符號和2的補碼數字雜耍,你可以用十六進制指定掩碼並完成它。


由於Java 7,你也可以使用binary literals這使得它更容易爲人類瞭解哪些位以位掩碼設置。而二進制文字可能會利用underscores將這些位分成不同的組。

這意味着,下面的內容也是有效的:

public final static int DELETION_MASK = 0b0000_0001; 
+3

所以我想唯一的好處是可讀性和性能沒有關係 –

+0

真棒。感謝您詳細解釋這一點。 –

+0

這是一個很棒的答案,我一直在尋找一個徹底的解釋,這對我來說是一個好的開始。 –

2

只有這樣,當您定義NONDELETION_MASK = 0x0A時它將保持一致。

+0

感謝您的答覆 –

0

這是很容易理解的。每當我們考慮掩飾時,我們總是用HEX或BIN數字來思考。

+0

感謝您的答覆 –

8

它有助於整數值和它表示的位模式之間的心理轉換,這對於標誌和掩碼而言非常重要。

因爲16是2(不像10)的功率,你會得到很好的重複這樣的事情:

public final static int A_FLAG = 0x01; // 00000001 
public final static int B_FLAG = 0x02; // 00000010 
public final static int C_FLAG = 0x04; // 00000100 
public final static int D_FLAG = 0x08; // 00001000 
public final static int E_FLAG = 0x10; // 00010000 
public final static int F_FLAG = 0x20; // 00100000 
public final static int G_FLAG = 0x40; // 01000000 
public final static int H_FLAG = 0x80; // 10000000 
+2

在C++中,我們只使用 (1 << 0) (1 << 1) (1 << 2) (1 << 3) 對眼睛使它變得更輕鬆。 – Chad