Подобно тому, как вы можете определить целочисленную константу в шестнадцатеричном или восьмеричном формате, могу ли я сделать это в двоичном формате?
Признаюсь, это действительно простой (и глупый) вопрос. Мои поиски в 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;
источник
Чуть более неудобный ответ:
public class Main { public static void main(String[] args) { byte b = Byte.parseByte("10", 2); Byte bb = new Byte(b); System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" ); } }
который выводит [java] bb должен быть 2, значение - "2"
источник