Intereting Posts
Службы Google Play нарушают сеть GSM Как вы легко делитесь переменными с другими видами деятельности? Безопасность строковых ресурсов Идентификатор языка .idea / misc.xml languageLevel продолжает изменять JDK Поддерживают ли константы кода версии для Android более старые версии? Как открыть Google Карты с помощью адреса? Включить опцию синхронизации по умолчанию, когда false в приложении. Как я могу использовать VectorDrawable с помощью панели инструментов Android? Android изменить цвет текста элементов в прядильщике Я обновил Android от targetSdk 22 до 23, и я получаю NoSuchMethodError. Как я могу это исправить? Обновить ListView в основном потоке из другого потока Хранение идентификаторов R.drawable в массиве XML Добавление версии сервисов Google Play в манифест вашего приложения? WebView бросает приемник не зарегистрирован: android.widget.ZoomButtonsController 'Android.support.test.espresso не существует', когда я хочу использовать его для отдельного теста apk

Что означает «| =»? (Равномерный оператор трубы)

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

Solutions Collecting From Web of "Что означает «| =»? (Равномерный оператор трубы)"

|= Читается так же, как += .

 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; 

У вас уже есть достаточный ответ на ваш вопрос. Но может быть, мой ответ поможет вам больше о |= виде двоичных операторов.

Я пишу таблицу для побитовых операторов :
Действуют следующие действия:

 ---------------------------------------------------------------------------------------- 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, который называется сдвигом без знака
    Но >>>= не оператор в Java. >>> = оператор

  • ~ Бит побитового дополнения, от 0 to 1 and 1 to 0 (унарный оператор), но ~= не оператор.

  • Кроме того ! Вызывается логическим оператором NOT, но != Проверяет, равно ли значение двух операндов или нет, если значения не равны, тогда условие становится истинным. Например (A != B) is true . Где A=!B означает, что если B true тогда A становится false (а если B является false то A становится true ).

Примечание стороны: | Не называется pipe, вместо этого его называют OR, pipe – терминологией оболочки, передающей один процесс на следующий.

Это сокращение для этого:

 notification.defaults = notification.defaults | Notification.DEFAULT_SOUND; 

И | Это бит-мудрый ИЛИ.

| Является побитовым или оператором, и он применяется как += .

Я искал ответ о том, что |= делает в Groovy, и хотя ответы выше, они не помогают мне понять конкретный код, который я смотрел.

В частности, при применении к логической переменной «| =» она будет установлена ​​в TRUE при первом появлении правдивого выражения с правой стороны и будет удерживать его значение 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 

Примечание: || = не существует. (Логический или) Вы можете использовать

 y= y || expr; // expr is NOT evaluated if y==true 

или

 y = expr ? true : y; // expr is always evaluated.