как логические значения обрабатываются в Java с помощью побитовых операторов - PullRequest
3 голосов
/ 06 мая 2011

рассмотрите этот пример, пожалуйста

int i=11, j=5;
boolean b=true, c=false;
System.out.println(b&c); // --> output=false
System.out.println(i&j); // --> output=1

Как по битам оператор работает с булевыми переменными?

Ответы [ 4 ]

12 голосов
/ 06 мая 2011

В Java boolean нет побитовых операций.

& и | не выполняют битовые операции в Java, но логические операции (как указано в §15.22.2 из JLS ) .

  • & - это логическое И (оно будет иметь значение true тогда и только тогда, когда оба аргумента равны true)
  • | - это логическое ИЛИ (оно будет оцениваться до true тогда и только тогда, когда хотя бы один из аргументов будет true).

Обратите внимание, что те же самые операторы используются для битовых операций , но они применяются только тогда, когда оба операнда имеют тип, который может быть преобразован в целочисленный тип (т. Е. byte, char, short, int, long и их соответствующие обертки).

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

Во-первых: Да , на уровне некоторый , эти две операции будут работать точно так же, кромеept для размера их ввода (который может даже быть идентичен, из-за оптимизации).

Но , здесь есть по крайней мере 3 уровня:

  • Язык Java

    Спецификация языка Java определяет boolean как примитивный тип с двумя значениями true и false.Он не определяет числовые значения для этих значений, и нет прямого способа преобразовать его в числовой тип или наоборот (см. Последнее предложение §4.2.2 )

  • Виртуальная машина Java

    Спецификация виртуальной машины Java определяет тип boolean , но обеспечивает очень небольшую поддержку для него.

    Это также говорит о преобразованиях

    Виртуальная машина Java кодирует boolean компонентов массива, используя 1 для представления true и 0 для представления false.Если значения языка программирования Java boolean сопоставляются компиляторами со значениями типа виртуальной машины Java int, компиляторы должны использовать одну и ту же кодировку.

    самый простой способВыполнение этого требования в JVM, очевидно, должно позволять 1 быть true и 0 ложным и разрешать операцию преобразования не выполнять.Это также наиболее вероятная реализация, но это не обязательно единственно правильная реализация.

  • Аппаратное обеспечение

    Это сильно варьируется, но большинство процессоровнет поддержки типа boolean (почему они должны?), поэтому для операций на boolean здесь будут использоваться обычные побитовые операции.

9 голосов
/ 06 мая 2011

Для логического типа:

Операторы & и && обрабатываются как логические И

Операторы | и || рассматриваются как логические ИЛИ.

У вас также есть ^, который выполняет XOR и !, который выполняет NOT.


Как это работает в JVM и как оно сравнивается с побитовыми целочисленными операциями?

На уровне байтового кода FALSE имеет значение 0, а TRUE - значение. Из javap -c java.lang.Boolean

static {};
  Code:
   0:   new     #56; //class java/lang/Boolean
   3:   dup
   4:   iconst_1
   5:   invokespecial   #89; //Method "<init>":(Z)V
   8:   putstatic       #86; //Field TRUE:Ljava/lang/Boolean;
   11:  new     #56; //class java/lang/Boolean
   14:  dup
   15:  iconst_0
   16:  invokespecial   #89; //Method "<init>":(Z)V
   19:  putstatic       #85; //Field FALSE:Ljava/lang/Boolean;

В этом коде он определяет TRUE как new Boolean(true), и вы можете видеть, что true помещается в стек с помощью iconst_1, что похоже на push (1). Аналогично iconst_0 или 0 используется для false

Если вы отобразите false <=> 0 и true <=> 1, вы увидите, что & и | работают одинаково для int и boolean

2 голосов
/ 06 мая 2011

В вашем случае, я полагаю, единственное отличие ч / б & и && заключается в том, что для & второй операнд все равно будет оцениваться, даже если первый операнд оценивается как ложный, тогда как в в случае && второй операнд не оценивается, если первый оценивается как false.

В основном актуально, если в вашем выражении есть дорогостоящий метод.

0 голосов
/ 06 мая 2011

Первая операция, которую вы выполняете - ИСТИНА и ЛОЖЬ, принимается за 1 и 0. Это ложно.

Вторая операция - 11 и 5 принимается за 1011 и 0101 (двоичные значения), что0001 при добавлении.

...