Подобно тому, как вы можете определить целочисленную константу в шестнадцатеричном или восьмеричном, могу ли я сделать это в двоичном формате?
Я признаю, что это очень простой (и глупый) вопрос. Мои поисковые запросы 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 и двоичная нотация: Освоение экзамена OMP Java Programmer (OCPJP)
В Java 7:
int i = 0b10101010;
В старых версиях Java нет бинарных литералов (см. другие ответы для альтернатив).
В Java нет бинарных литералов, но я полагаю, что вы могли бы это сделать (хотя я не вижу смысла):
int a = Integer.parseInt("10101010", 2);
Ответ от Ed Swangren
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
}
Найдите "синтаксис литералов Java" в Google, и вы придумали некоторые записи.
Существует восьмеричный синтаксис (префикс вашего номера с 0), десятичный синтаксис и шестнадцатеричный синтаксис с префиксом "0x". Но никакой синтаксис для двоичной нотации.
Некоторые примеры:
int i = 0xcafe ; // hexadecimal case
int j = 045 ; // octal case
int l = 42 ; // decimal case
Если вы хотите возиться с большим количеством двоичных файлов, вы можете определить некоторые константы:
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"