Подібно до того, як ви можете визначити цілу константу в шістнадцятковій чи вісімковій, чи можу я це зробити в двійковій формі?
Я визнаю, що це справді легке (і дурне) питання. Мої пошукові запити в Google з’являються порожніми.
Подібно до того, як ви можете визначити цілу константу в шістнадцятковій чи вісімковій, чи можу я це зробити в двійковій формі?
Я визнаю, що це справді легке (і дурне) питання. Мої пошукові запити в Google з’являються порожніми.
Відповіді:
Отже, з випуском Java SE 7, двійкові позначення є стандартними. Синтаксис досить прямий і очевидний, якщо ви гідно розумієте двійковий файл:
byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111;
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;
І особливо щодо декларування змінних рівня класу як двійкові файли, немає абсолютно ніяких проблем з ініціалізацією статичної змінної за допомогою двійкових позначень:
public static final int thingy = 0b0101;
Тільки будьте обережні, щоб не заповнити числа занадто великою кількістю даних, інакше ви отримаєте помилку компілятора:
byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte
Тепер, якщо ви дійсно хочете пофантазувати, ви можете поєднати цю іншу акуратну нову функцію в Java 7, відому як числові літерали, з підкресленнями. Погляньте на ці вигадливі приклади двійкових нотацій із буквальним підкресленням:
int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;
Тепер хіба це не приємно і чисто, не кажучи вже про читаність?
Я взяв ці фрагменти коду з невеликої статті, яку написав про цю тему на TheServerSide. Не соромтеся ознайомитися з цим, щоб отримати докладнішу інформацію:
Java 7 і двійкові нотації: освоєння іспиту OCP Java Programmer (OCPJP)
У Java 7:
int i = 0b10101010;
У старих версіях Java немає бінарних літералів (див. Інші відповіді щодо альтернатив).
_
символи, що роблять послідовність більш читабельною: int i = 0b1010_1010_0011;
У Java немає бінарних літералів, але я припускаю, що ви могли б це зробити (хоча я не бачу сенсу):
int a = Integer.parseInt("10101010", 2);
Відповідь Еда Свонгрена
public final static long mask12 =
Long.parseLong("00000000000000000000100000000000", 2);
працює нормально. Я використав long
замість int
і додав модифікатори, щоб пояснити можливе використання як бітової маски. Однак такий підхід має дві незручності.
Я можу запропонувати альтернативний підхід
public final static long mask12 = 1L << 12;
Цей вираз робить очевидним, що 12-й біт дорівнює 1 (відлік починається з 0, справа наліво); а коли ви наводите курсор миші, підказка
long YourClassName.mask12 = 4096 [0x1000]
з'являється в Eclipse. Ви можете визначити більш складні константи, такі як:
public final static long maskForSomething = mask12 | mask3 | mask0;
або явно
public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);
Значення змінної maskForSomething
все ще буде доступне в Eclipse під час розробки.
Оголосіть константи:
public static final int FLAG_A = 1 << 0;
public static final int FLAG_B = 1 << 1;
public static final int FLAG_C = 1 << 2;
public static final int FLAG_D = 1 << 3;
і використовувати їх
if( (value & ( FLAG_B | FLAG_D )) != 0){
// value has set FLAG_B and FLAG_D
}
Шукайте в Google "синтаксис літералів Java", і ви придумаєте кілька записів.
Існує вісімковий синтаксис (префікс вашого числа 0), десятковий синтаксис та шістнадцятковий синтаксис із префіксом "0x". Але відсутність синтаксису двійкових записів.
Кілька прикладів:
int i = 0xcafe ; // hexadecimal case
int j = 045 ; // octal case
int l = 42 ; // decimal case
byte b = 0b01000001
(для кращої готовності byte b = 0b0100_0001
).
Якщо ви хочете возитися з великою кількістю двійкових файлів, ви можете визначити деякі константи:
public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;
тощо
або
public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;