Что означает "| ="? (оператор равных труб)

Я попытался выполнить поиск с помощью 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.

Ответ 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.