(1) Выполняет ли он какие-то манипуляции с битами?
Если вы используете |
с числовыми операндами, то да, это будет bitwise OR, если вы используете его на булевых операндах будет логично (не от короткого замыкания) ИЛИ. Пример
Логическое ИЛИ: позволяет сказать, что 1
представляет true
и 0
false
+---+---+-------+
| p | q | (p|q) |
+---+---+-------+
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
+---+---+-------+
Побитовое ИЛИ будет выполнять подобную операцию, как логическое значение, но будет использовать соответствующие биты
decimal binary
6 = 00110
3 = 00011
OR -------------
00111
(2) Что действительно ли это означает?
x |= y
такая же, как x = x | y
так он будет рассчитывать x | y
и хранить его в x
.
(3) Есть ли другие хорошо известные знаки, подобные этому?
Да, каждый арифметика, побитовое или бит оператор сдвига может быть использован таким образом: +=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
>>>=
Вот некоторые дополнительные сведения об использовании |=
в
notification.flags |= Notification.FLAG_AUTO_CANCEL;
Допустим, что у нас есть пять свойств.
Property1
Property2
Property3
Property4
Property5
Мы можем использовать последние пять бит числа, чтобы представляют ситуации, в которых мы имеем (1) или нет (0) некоторого свойства.
...00xxxxx
│││││
││││└─ flag for Property1
│││└── flag for Property2
││└─── flag for Property3
│└──── flag for Property4
└───── flag for Property5
Теперь, позволяет сказать, что мы хотим использовать только свойства 1, 2 и 4. Для того, чтобы сделать это, мы должны установить биты проиндексированы с 0, 1 и 3 к значению 1, как
...0001101
│││││
││││└─ (1) has Property1
│││└── (0) no Property2
││└─── (1) has Property3
│└──── (1) has Property4
└───── (0) no Property5
Другими словами, мы должны произвести число 13 (= ** 1 *** 8 + ** 1 *** 4 + ** 0 *** 2 + ** 1 *** 1). Мы можем сделать это с помощью оператора |
или битовой 8|4|1
потому
8 = ...001000
4 = ...000100
1 = ...000001
OR -------------
13 = ...001101
Но чтобы избежать magic numbers мы можем создать константы, которые будут приведены наши свойства в битном мире. Таким образом, мы можем создать
public class MyProperties {
//...
public static final int PROPERTY_1 = 0b0000_0001; // = 1
public static final int PROPERTY_2 = 0b0000_0010; // = 2
public static final int PROPERTY_3 = 0b0000_0100; // = 4
public static final int PROPERTY_4 = 0b0000_1000; // = 8
public static final int PROPERTY_5 = 0b0001_0000; // = 16
//...
//rest of code: methods, constructors, other fields
}
и использовать его в дальнейшем как
int context = Properties.PROPERTY_1|Properties.PROPERTY_2|Properties.PROPERTY_4
который является более удобным для чтения, чем int context = 8|4|1
.
Теперь, если мы хотим изменить наш контекст и позволяет сказать, что добавить PROPERTY_3
мы можем использовать
context = context | Properties.PROPERTY_3;
или сокращенный вариант на основе сложных заданий операторов
context |= Properties.PROPERTY_3;
, который будет делать это расчеты
context = 000...00001101
PROPERTY_3 = 000...00000010
OR ------------------------
000...00001111
(главное различие между добавлением значения PROPERTY_3
к context
и с помощью побитового ИЛИ |
является то, что, когда context
уже будет иметь PROPERTY_3
набор для 1
тогда или будет никакого эффекта это).
Теперь, если вы посмотрите here идею использования отдельных бит в качестве флагов для свойств используются в Notification
классе, где FLAG_AUTO_CANCEL
константа имеет значение 16
(0x010
в шестнадцатеричном, 0b0001_0000
в двоичном).
Отредактировано. Надеюсь, что для веб-серфинга достаточно ключевых слов. – timrau
отличное редактирование, спасибо человеку! – Behnam
Побитово или логично, в зависимости от типов операндов. – EJP