Что означает | = в Java / Android? (присваивание поразрядным ИЛИ)

Возможный дубликат:
Ярлык или назначение (| = ) оператор в Java

Я нашел следующий пример кода в документации Android SDK:

    boolean retValue = false;
    retValue |= mActionBarHelper.onCreateOptionsMenu(menu);
    retValue |= super.onCreateOptionsMenu(menu);

Может ли кто-нибудь показать мне эквивалентный код, чтобы продемонстрировать, что он делает?

Примечание: я предполагаю, что вызовы методов возвращают логическое значение, поэтому мне нравится видеть пример того, как это выглядит как конструкция if-else.


person mrd    schedule 10.05.2012    source источник
comment
@GregKopff: Это побитовое ИЛИ, а не логическое ИЛИ.   -  person Makoto    schedule 11.05.2012
comment
@Makoto: Я не думал, что существует определенное битовое представление логического типа данных.   -  person Greg Kopff    schedule 11.05.2012
comment
@GregKopff: Побитовое ИЛИ означает, что вы берете два набора битов и сохраняете высокий уровень битов тогда и только тогда, когда бит в том же месте установлен высоким. Пример: 1001 | 0110 = 1111. Дополнительную информацию см. В Википедии.   -  person Makoto    schedule 11.05.2012
comment
@Makoto: Хорошо понятно - и для байтов, символов, шорт, целых и длинных чисел, которые имеют определенное битовое представление, это имеет смысл. Конечно, логическое значение можно рассматривать как 1 бит (язык использует байт для его хранения), но у него нет битового представления, как у других типов данных. Вы не можете преобразовать логическое значение в байт и получить 0x00 / 0x01. Да, поразрядную операцию достаточно легко осмыслить на одном бите, но по причинам, указанным выше, я удивлен этим.   -  person Greg Kopff    schedule 11.05.2012


Ответы (2)


Сокращение для or с собой и назначить мне, хотя это не короткое замыкание or вместо логического or. Поскольку он доступен как краткая версия присваивания and or: ing, иногда используется в любом случае с логическими значениями, поскольку нет || =. Но важное замечание: в этом случае он будет вызывать оба метода, даже если retValue уже может быть true

Таким образом, эквивалентных (логических) утверждений может быть несколько, но некоторые из них будут:

boolean a = mActionBarHelper.onCreateOptionsMenu(menu);
boolean b = super.onCreateOptionsMenu(menu);
boolean retValue =  a || b;

or

boolean retValue = mActionBarHelper.onCreateOptionsMenu(menu);
retValue = super.onCreateOptionsMenu(menu) || retValue;
person Mattias Isegran Bergander    schedule 10.05.2012

| к логическому значению применяется просто логическое ИЛИ.

boolean retValue = false;
retValue = retValue | mActionBarHelper.onCreateOptionsMenu(menu);
retValue = retValue | super.onCreateOptionsMenu(menu);
person Marko Topolnik    schedule 10.05.2012