在C++中,"|="操作符代表什么意思?

12

我有以下代码,但我不理解它的含义:

var1 |= var2>0 ? 1 : 2;

请问有人能帮我吗?


1
在计算机科学中,这被称为“复合赋值”。 - Johannes Schaub - litb
2
你应该学习这门编程语言。 - starblue
顺便提一下,这在Java中也是可行的,例如 int var1, var2 - polygenelubricants
它被称为“某人过于聪明而创造了难以阅读的代码,而不是创建干净、逻辑结构良好且易于阅读和维护的代码”。polygenelubricants的回答很完美,因为它可以立即被理解。 - AMissico
8个回答

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

这是按位或运算。


12

所有的a op= b运算符都是a = a op b的快捷方式。

然而,由于C++允许分别重载opop=,因此您需要依赖自定义类型的每个实现者保持一致性。


1
我认为在 @@= 中执行不同任务的人是邪恶的。:s - Matthieu M.
1
@Matthieu:C++ 是一种(而且在我看来,永远都会是一种)让你有足够的绳子可以用来绞死自己的语言。 - Richard
我不知道有人实现它们以具有不同的行为(除了复合赋值显然会改变其左操作数)。但是单独实现其中一个而不实现另一个是相当常见的,例如iostreams插入运算符。 - Ben Voigt
1
但是要愚蠢到把绳子系在自己的脖子上需要付出努力。 - GManNickG
a != b; 不等同于 a = a ! b; - Grant Paul

7

6

cond ? x : y表示如果条件为真,则返回x,否则返回y。详见三目运算符

a |= ba = a | b的简写形式,它将a | b赋值给a

a | b是对ab进行按位或运算的结果。(例如2 | 3 = 3,1 | 2 = 3)


4
正如其他人所说,它是 v1 = v1 | v2; 的缩写。 你可能会遇到另一种用法,即布尔值。 例如:
bool b = /*some value*/

不要说:

if(a)
  b = true;

你可能会看到:

  b |= a;

4

整数可以用二进制表示,因此每个数字(位、开关)都是1(开)或0(关):

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

按位或(Bitwise OR)通过“合并”两组比特来组合两个数字:

First number:     00110000
Second number:    00000010
Result:           00110010

如果输入数字中的任意一个二进制位为1,则结果中的该位也将为1。

与按位与比较,它查找两组比特的“重叠”:

First number:     00110100
Second number:    10011110
Result:           00010100

如果两个输入数字的相应位都是1,则结果中的该位也为1。

如果这些数字存储在变量a和b中,您可以将按位OR/AND的结果存储到一个新变量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

3

正如之前其他人提到的那样,这意味着您最终会通过按位OR获得分配。

按位OR可以通过将左侧和右侧的位模式放在一起来说明。

在每个列中:0 + 0等于0,1 + 0等于1,0 + 1等于1,1 + 1等于1。
在布尔上下文中:false OR false == false,true OR false == true,false OR true == true,true OR true == true。

这是按位OR的一个示例及其结果的位模式: var1(11) |= var2(14) --> var1(15)

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

2
运算符 |= 表示按位或运算符赋值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接