Преимущество использования 0x01 вместо 1 для целочисленной переменной? - PullRequest
19 голосов
/ 30 июня 2011

Недавно я наткнулся на такую ​​строку

public final static int DELETION_MASK = 0x01;

почему это не похоже на

public final static int DELETION_MASK = 1;

Есть ли какое-либо преимущество в использовании первого подхода, кроме 0xA, и шестнадцатеричные значения верхнего предела могут быть легко преобразованы ?? В этом случае это просто константа, представляющая 1.

Ответы [ 4 ]

21 голосов
/ 30 июня 2011

Хотя в коде, создаваемом компилятором, нет различий, битовые маски традиционно пишутся с использованием шестнадцатеричной записи, поскольку человеку значительно проще преобразовать в двоичную форму. Другое распространенное соглашение состоит в том, чтобы включать начальные нули, когда известна длина поля. Например. для поля C int обычно пишется:

#define MASK 0x0000ffff

Кроме того, шестнадцатеричные константы указывают программисту, что это , вероятно, битовая маска или значение, которое будет каким-либо образом задействовано в побитовых операциях и, вероятно, должно обрабатываться специально.

В качестве бонуса шестнадцатеричные обозначения могут также избежать проблем с отрицательными числами: 0xffffffff на самом деле является отрицательным числом (точнее, -1). Вместо того, чтобы манипулировать со знаком и числами, дополняющими 2, вы можете просто указать маску в шестнадцатеричном формате и покончить с этим.


Начиная с Java 7, вы также можете использовать двоичные литералы , что позволяет человеку еще проще понять, какие биты установлены в битовой маске. И двоичные литералы могут использовать подчеркивания , чтобы разбить биты на отдельные группы.

Это означает, что также верно следующее:

public final static int DELETION_MASK = 0b0000_0001;
10 голосов
/ 30 июня 2011

Помогает в умственном преобразовании между целочисленным значением и битовым шаблоном, который он представляет, что важно для флагов и масок.

Поскольку 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 голосов
/ 30 июня 2011

Только это будет согласовано, если вы определите NONDELETION_MASK = 0x0A.

0 голосов
/ 30 июня 2011

Это легко понять. Всякий раз, когда мы думаем о маскировке, мы всегда думаем о шестнадцатеричных или двоичных числах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...