Что означает "| ="? (оператор равных труб)
Я попытался выполнить поиск с помощью Google Search и Stack Overflow, но он не обнаружил никаких результатов. Я видел это в коде библиотеки openource:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Что означает "| =" (pipe equal operator
)?
Ответы
Ответ 1
|=
читается так же, как +=
.
notification.defaults |= Notification.DEFAULT_SOUND;
совпадает с
notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;
где |
- бит-оператор OR.
Все операторы ссылаются на здесь.
Используется битовый оператор, поскольку, как это часто бывает, эти константы позволяют int переносить флаги.
Если вы смотрите в этих константах, вы увидите, что у них есть две возможности:
public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary
Таким образом, вы можете использовать бит-мудрый ИЛИ для добавления флагов
int myFlags = DEFAULT_SOUND | DEFAULT_VIBRATE; // same as 001 | 010, producing 011
так
myFlags |= DEFAULT_LIGHTS;
просто означает, что мы добавляем флаг.
И симметрично, мы проверяем флаг, установленный с помощью &
:
boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;
Ответ 2
У вас уже есть достаточный ответ на ваш вопрос. Но может быть, мой ответ поможет вам больше о |=
виде двоичных операторов.
Я пишу таблицу для побитовых операторов:
Действуют следующие действия:
----------------------------------------------------------------------------------------
Operator Description Example
----------------------------------------------------------------------------------------
|= bitwise inclusive OR and assignment operator C |= 2 is same as C = C | 2
^= bitwise exclusive OR and assignment operator C ^= 2 is same as C = C ^ 2
&= Bitwise AND assignment operator C &= 2 is same as C = C & 2
<<= Left shift AND assignment operator C <<= 2 is same as C = C << 2
>>= Right shift AND assignment operator C >>= 2 is same as C = C >> 2
----------------------------------------------------------------------------------------
Обратите внимание, что все операторы являются бинарными операторами.
Также Примечание: (ниже я хотел добавить свой ответ)
-
>>>
- это побитовый оператор в Java, который называется Unsigned shift
, но >>>=
не является оператором в Java. → >= operator
-
~
является битовым битом дополнения, 0 to 1 and 1 to 0
(оператором Unary), но ~=
не является оператором.
-
Кроме того, !
Called Logical NOT Operator, но !=
Проверяет, равно ли значение двух операндов или нет, если значения не равны, тогда условие становится истинным. например (A != B) is true
. где A=!B
означает, что если B
true
, то A
станет false
(а если B
false
, то A
станет true
).
side note: |
не называется pipe, вместо этого его называют OR, pipe - терминологией оболочки, передающей один процесс на следующий.
Ответ 3
Это сокращение для этого:
notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;
И |
является бит-мудрым OR.
Ответ 4
|
является оператором поразрядным или, и он применяется как +=
.
Ответ 5
Я искал ответ о том, что |=
делает в Groovy, и хотя ответы выше правильные, они не помогли мне понять конкретный фрагмент кода, на который я смотрел.
В частности, когда применяется к логической переменной "| =", она будет установлена в ИСТИНА в первый раз, когда она встретит правдивое выражение с правой стороны и будет удерживать ее значение TRUE для всех | = последующих вызовов. Как защелка.
Здесь приведен упрощенный пример:
groovy> boolean result
groovy> //------------
groovy> println result //<-- False by default
groovy> println result |= false
groovy> println result |= true //<-- set to True and latched on to it
groovy> println result |= false
Вывод:
false
false
true
true
Изменить:
Почему это полезно?
Рассмотрим ситуацию, когда вы хотите узнать, изменилось ли что-то на разных объектах, и, если это так, сообщите об одном из изменений. Итак, вы должны установить hasChanges
boolean и установить его на |= diff (a,b)
, а затем |= dif(b,c)
и т.д.
Вот краткий пример:
groovy> boolean hasChanges, a, b, c, d
groovy> diff = {x,y -> x!=y}
groovy> hasChanges |= diff(a,b)
groovy> hasChanges |= diff(b,c)
groovy> hasChanges |= diff(true,false)
groovy> hasChanges |= diff(c,d)
groovy> hasChanges
Result: true
Ответ 6
Примечание: || = не существует. (логический или)
Вы можете использовать
y= y || expr; // expr is NOT evaluated if y==true
или
y = expr ? true : y; // expr is always evaluated.