Что означает операция «| =» в C ++? - PullRequest
12 голосов
/ 17 апреля 2010

У меня есть следующий код, и я не могу понять, что это значит:

var1 |= var2>0 ? 1 : 2;

Кто-нибудь может мне помочь, пожалуйста!

Ответы [ 8 ]

21 голосов
/ 17 апреля 2010
if (var2 > 0)
  var1 = var1 | 1;
else 
  var1 = var1 | 2;

Это поразрядно или.

12 голосов
/ 17 апреля 2010

Все операторы a op= b являются ярлыками для a = a op b.

Однако, поскольку C ++ допускает переопределение op и op= отдельно, вы полагаетесь на то, что каждый разработчик пользовательских типов будет согласованным.

7 голосов
/ 17 апреля 2010

Это Assignment by bitwise OR

v1 |= v2;

это сокращение от:

v1 = v1 | v2;
6 голосов
/ 17 апреля 2010

cond ? x : y возвращает x, если значение cond равно true, и y в противном случае. Читать Тернарный оператор

a |= b является сокращением для a = a | b, которое присваивает a | b a

a | b - это поразрядно ИЛИ из a и b. (например, 2 | 3 = 3 и 1 | 2 = 3)

4 голосов
/ 17 апреля 2010

Целые числа могут быть представлены в двоичном виде, так что каждая цифра (бит, переключатель) равна 1 (включено) или 0 (выключено):

00000000  ==  0
00000001  ==  1
00000010  ==  2
00000011  ==  3
00000100  ==  4
00001000  ==  8
00010000  ==  16

Побитовое ИЛИ объединяет два числа, "объединяя" два набора битов:

First number:     00110000
Second number:    00000010
Result:           00110010

Если бит равен 1 в ЛИБО входных числах, то в результате он будет равен 1.

Сравните с побитовым И, который находит "перекрытие" двух наборов битов:

First number:     00110100
Second number:    10011110
Result:           00010100

Если бит равен 1 в ОБА входных чисел, то он будет равен 1 в результате.

Если числа находятся в переменных a и b, вы можете поместить результаты побитового ИЛИ / И в новую переменную c:

unsigned int c = a | b; // OR

unsigned int c = a & b; // AND

Часто результат необходимо поместить в одну из двух переменных, т. Е.

unsigned int c = a | b; // OR
c = a; // copy

Итак, для краткости, вы можете сделать это за один шаг:

a |= b; // merge b directly into a
4 голосов
/ 17 апреля 2010

Как уже говорили другие, это сокращение от v1 = v1 | v2; Другое использование, с которым вы можете столкнуться - это booleans.
Дано:

bool b = /*some value*/

Вместо того чтобы сказать:

if(a)
  b = true;

вы можете увидеть:

  b |= a;
3 голосов
/ 17 апреля 2010

Как уже упоминали другие люди до меня, это означает, что вы будете выполнять задания побитовым ИЛИ.

Побитовое ИЛИ можно проиллюстрировать, взяв битовые комбинации слева и справа и поместив их поверх друг друга.

В каждом столбце: 0 + 0 дает 0, 1 + 0 дает 1, 0 + 1 дает 1, 1 + 1 дает 1.
В контексте логических значений: ложно ИЛИ ложно == ложно, верно ИЛИ ложно == верно, ложно ИЛИ верно == верно, верно ИЛИ верно == верно.

Вот пример побитового ИЛИ и результирующий битовый шаблон: var1 (11) | = var2 (14) -> var1 (15)

    1011 (11)
OR  1110 (14)  
=   1111 (15)
2 голосов
/ 17 апреля 2010

Оператор | = означает присвоение побитовым оператором ИЛИ

...