Я попытался выполнить поиск с помощью Google Search и Stack Overflow, но он не дал никаких результатов. Я видел это в коде библиотеки с открытым исходным кодом:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Что значит "| =" ( pipe equal operator
)?
pipe equal operator
не поможет ли поиск людей что-то подобное этому вопросу или какой-либо другой документации по этой теме.vertical bar
который наконец привел меня сюда.Ответы:
|=
читает так же, как+=
.такой же как
где
|
- побитовый оператор ИЛИВсе операторы упоминаются здесь .
Используется побитовый оператор, потому что, как правило, эти константы позволяют int переносить флаги.
Если вы посмотрите на эти константы, вы увидите, что они имеют две степени:
Таким образом, вы можете использовать побитовое ИЛИ, чтобы добавить флаги
так
просто означает, что мы добавляем флаг.
И симметрично, мы проверяем, установлен ли флаг, используя
&
:источник
j += 1;
это так же, какj = j + 1;
.j
естьvolatile
?), Но я поверю на слово.boolean hasVibrate = DEFAULT_VIBRATE & myFlags;
- Вы можете перевести сint
наboolean
подобное в Java? Это было бы допустимо в C, но я думал, что в Java это должно было быть написано какboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
+=
наконец помогло мне понять это. Спасибо!У вас уже есть достаточный ответ на ваш вопрос. Но, может быть, мой ответ поможет вам больше о
|=
бинарных операторах.Я пишу таблицу для побитовых операторов :
следующие действительны:
Обратите внимание, что все операторы являются бинарными операторами.
Также обратите внимание: (для пунктов ниже я хотел бы добавить свой ответ)
>>>
является побитовым оператором в Java, который называется беззнаковым сдвигомно>>> = оператор>>>=
не оператор в Java.~
является битовым дополнением бит0 to 1 and 1 to 0
(Унарный оператор), но~=
не оператор.Кроме того,
!
Called Logical NOT Operator, но!=
проверяет, равны ли значения двух операндов или нет, если значения не равны, условие становится истинным. например(A != B) is true
. где какA=!B
означает, еслиB
есть,true
тоA
статьfalse
(и еслиB
есть,false
тоA
статьtrue
).примечание:
|
не называется pipe, вместо этого вызывается OR, труба - это терминология оболочки, передающая один процесс следующему.источник
Я искал ответ о том, что
|=
делает в Groovy, и, хотя ответы выше верны, они не помогли мне понять определенный фрагмент кода, на который я смотрел.В частности, при применении к логической переменной «| =» она будет установлена в значение ИСТИНА, когда в первый раз встречает правдивое выражение с правой стороны, и УДЕРЖИВАЕТ свое значение ИСТИНА для всех последующих вызовов =. Как защелка.
Вот упрощенный пример этого:
Вывод:
Редактировать : Почему это полезно?
Рассмотрим ситуацию, когда вы хотите узнать, изменилось ли что-либо на различных объектах, и если да, уведомить кого-нибудь об этих изменениях. Итак, вы должны установить
hasChanges
логическое значение и установить его,|= diff (a,b)
а затем|= dif(b,c)
и т. Д. Вот краткий пример:источник
y|=expr
является коротким замыканием (в отличие отy = y || expr
), то естьexpr
всегда оценивается. Это не было очевидно для меня в первый раз :) Поэтому важно отметить перед рефакторингом, что заменаy|=expr
↔ неy=y||x
является семантически эквивалентной в случае, если наexpr
самом деле имеет побочные эффекты.hasChanges
этим, вероятно, было бы лучше предпочестьy=y||x
форму, чтобы получить выгоду от короткого замыкания, потому что, когда вы нашли какое-либо изменение, на самом деле не нужно делать последующие сравнения, потому что вы уже знаете ответ. (Особенно важно в реальной ситуации, когда сравниваемые объекты сложны иdiff
их работа не совсем быстрая)||
и&&
, и в соответствующих разделах 15.23 и 15.24 спецификации этот факт четко заявлен, и это отличие от|
и&
подчеркивается.||=
и&&=
операторов , которые бы нарушать правила и требовать особого упоминания).Это сокращение для этого:
И
|
это немного мудрый ИЛИ.источник
|
является побитовым оператором или , и он применяется как+=
.источник
Примечание: || = не существует. (логично или) Вы можете использовать
или
источник
y |= expr
с логическими значениями, и он дает тот же результат,y
что и ваши варианты, с важным примечанием, что он не является кратковременным , что означает, что expr всегда вычисляется, даже в случаеy==true