2013-11-17 3 views
5

| =Что означает этот знак? | =

Мне любопытно узнать об этом операторе, Я видел эту нотацию, используемую при установке флагов в Java.

, например:

notification.flags |= Notification.FLAG_AUTO_CANCEL; 
  1. ли выполнять какие-то манипуляции с битами?

  2. Что это значит?

  3. Есть ли другие хорошо известные знаки, подобные этому?

ответ

8

Это эквивалентно

notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL; 

где | является побитовое ИЛИ оператор, или две переменные бит за битом.

Это хорошо известно само по себе. Также имеются +=, -=, *=, /=, %=, &=, ^=.

+0

Отредактировано. Надеюсь, что для веб-серфинга достаточно ключевых слов. – timrau

+0

отличное редактирование, спасибо человеку! – Behnam

+1

Побитово или логично, в зависимости от типов операндов. – EJP

2

Выполняет ли он какие-то манипуляции с битами?

Да. Он «ИЛИ» - правый операнд в левую сторону.

Что это значит?

Это назначение в сочетании с OR.

Есть ли другие известные знаки, такие как это?

Есть много: +=, -=, *=, /=, %=, &=, и так далее. В совокупности они называются операциями присваивания . They are described in section 15.26.2 of the Java Language Specification.

3

Этот синтаксис также доступен на языках C/C++ и других языках. Это побитовое ИЛИ и то же самое, как:

notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL; 

и похож на других операторов, таких как сложение, вычитание, и т.д. Например:

i += 5; 

такая же, как:

i = i + 5; 
-1

Он называется побитовым или оператором.Например,

5  = 0000 0101 
2  = 0000 0010 
5 | 2 = 0000 0111 
     = 14 

Таким образом, эта концепция используется, когда одна и та же опция может использовать несколько значений.

В качестве примера рассмотрим переменные флаги, равные единице.

int flags = 1; 

Теперь, если значение флага 4 добавляется к нему с побитового или,

flags |= 4; // 0 

Вы можете определить, был ли 4 применяется на флагах с побитовое и.

if (flags & 4 == 4) // returns true 

Если этот флаг был применен к флагам, побитовым и возвращает флаг. Таким образом, мы можем использовать поразрядные и & поразрядные или.

Надеюсь, это поможет.

+0

Побитово или логично, в зависимости от типов операндов. – EJP

+0

@EJP Можете ли вы объяснить больше, пожалуйста? Я не могу понять. –

3

(1) Выполняет ли он какие-то манипуляции с битами?

Если вы используете | с числовыми операндами, то да, это будет bitwise OR, если вы используете его на булевых операндах будет логично (не от короткого замыкания) ИЛИ. Пример

Логическое ИЛИ: позволяет сказать, что 1 представляет true и 0false

+---+---+-------+ 
| 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 в двоичном).

+0

Все выше первой строки, а после второго - бесполезный пух. – EJP

+0

@EJP надеюсь, что сейчас лучше. – Pshemo

+0

Я бы не зашел так далеко, чтобы назвать это несущественным, конечно, они ответили на многие из моих растущих вопросов. – Behnam

Смежные вопросы