Что означает операция "| = " в C++?

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

var1 |= var2>0 ? 1 : 2;

кто может помочь мне, пожалуйста!

8 ответов


if (var2 > 0)
  var1 = var1 | 1;
else 
  var1 = var1 | 2;

Это побитовое или.


все a op= b операторы ярлык a = a op b.

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


его Assignment by bitwise OR

v1 |= v2;

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

v1 = v1 | v2;

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

a |= b - это сокращение для a = a | b что назначение a | b to a

a | b is побитовое или of a и b. ( например, 2 | 3 = 3 и 1 | 2 = 3 )


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

bool b = /*some value*/

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

if(a)
  b = true;

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

  b |= a;

целые числа могут быть представлены в двоичном формате, так что каждая цифра (бит, переключатель) равна 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 в результате.

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

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

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

побитовое или можно проиллюстрировать, взяв битовые шаблоны левой и правой стороны и положив их поверх друг друга.

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

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

    1011 (11)
OR  1110 (14)  
=   1111 (15)

оператор / = означает назначение побитовым или оператором