Подтвердить что ты не робот

Преимущество использования 0x01 вместо 1 для целочисленной переменной?

Недавно я столкнулся с такой линией

public final static int DELETION_MASK = 0x01;

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

public final static int DELETION_MASK = 1;

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

4b9b3361

Ответ 1

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

#define MASK 0x0000ffff

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

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


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

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

public final static int DELETION_MASK = 0b0000_0001;

Ответ 2

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

Поскольку 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

Ответ 3

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

Ответ 4

Легко понять. Всякий раз, когда мы думаем о маскировке, мы всегда думаем о номерах HEX или BIN.