最近我遇到這樣的一條線對於整數變量使用0x01而不是1的好處?
public final static int DELETION_MASK = 0x01;
爲什麼不喜歡
公共最後靜態INT DELETION_MASK = 1;
使用除0xA以外的第一種方法是否有優勢,並且上限十六進制可以輕鬆轉換?在這種情況下,它只是一個代表1的常量。
最近我遇到這樣的一條線對於整數變量使用0x01而不是1的好處?
public final static int DELETION_MASK = 0x01;
爲什麼不喜歡
公共最後靜態INT DELETION_MASK = 1;
使用除0xA以外的第一種方法是否有優勢,並且上限十六進制可以輕鬆轉換?在這種情況下,它只是一個代表1的常量。
儘管編譯器生成的代碼沒有區別,但是位掩碼傳統上使用十六進制表示法編寫,因爲它對於人類轉換爲二進制形式顯然更容易。另一個常見的約定是在字段長度已知時包含前導零。例如。一個C int
場,這是常見的寫:
#define MASK 0x0000ffff
此外,十六進制常量指示它的可能位掩碼,或者也會莫名其妙地被捲入位運算,並應可能是一個值的程序員特別對待。
作爲獎勵,十六進制符號也可以避免負數的問題:0xffffffff
實際上是一個負數(準確地說是-1
)。而不是與符號和2的補碼數字雜耍,你可以用十六進制指定掩碼並完成它。
由於Java 7,你也可以使用binary literals這使得它更容易爲人類瞭解哪些位以位掩碼設置。而二進制文字可能會利用underscores將這些位分成不同的組。
這意味着,下面的內容也是有效的:
public final static int DELETION_MASK = 0b0000_0001;
所以我想唯一的好處是可讀性和性能沒有關係 –
真棒。感謝您詳細解釋這一點。 –
這是一個很棒的答案,我一直在尋找一個徹底的解釋,這對我來說是一個好的開始。 –
只有這樣,當您定義NONDELETION_MASK = 0x0A時它將保持一致。
感謝您的答覆 –
這是很容易理解的。每當我們考慮掩飾時,我們總是用HEX或BIN數字來思考。
感謝您的答覆 –
它有助於整數值和它表示的位模式之間的心理轉換,這對於標誌和掩碼而言非常重要。
因爲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
在C++中,我們只使用 (1 << 0) (1 << 1) (1 << 2) (1 << 3) 對眼睛使它變得更輕鬆。 – Chad
它是一種常見的可讀性約定的面具,這似乎是,請參見http://計算器.com/questions/243712 /爲什麼使用十六進制(它的C + +但相同的基本原理) –