这和&算子意味着什么?

时间:2012-06-22 21:51:58

标签: c++ bitwise-operators

我正在阅读有关qt中openGL的一些教程。 其中一个鼠标事件槽中包含以下代码:

if (event->buttons() & Qt::LeftButton) {    
    rotationX += 180 * dy;
    rotationY += 180 * dx;
    updateGL();
}

&运算符在if语句中做什么? 它与==?

完全相同

5 个答案:

答案 0 :(得分:5)

==不同。它是按位AND 运算符。表达式的作用是从event->buttons()按位AND 获取返回值,并使用Qt::LeftButton表示的值。如果结果值不为零,则正在执行块。

实质上,它会检查Qt::LeftButton指定的按钮是否被按下。

此处使用bitwise AND运算符的原因是称为位掩码。这意味着event->buttons()的返回值只是一个值,它的位代表不同类型的状态。这里对& -operator所做的是它检查某些位(由Qt::LeftButton表示)是否在event->buttons()返回的值中设置(1)或取消设置(0)。如果未设置测试位,则返回值为零;如果至少设置了一个测试位,则返回值为非零。

可以在此处找到有关按位操作如何工作的更多详细信息:Wikipedia article about Bitwise operations

答案 1 :(得分:2)

那会测试值event => buttons()的位是Qt :: LeftButton。

如果没有那个位,结果将为0。和Qt :: LeftButton,如果确实包括那个位。

它是检查数字

上是否存在标志或位值的比较
0001 == 1
0010 == 2
0011 == 3

1 & 2 == 0 (false)
1 & 3 == 1 (true)
2 & 3 == 2 (true)

基本上它是两个值的匹配值。

  (0001) 
& (0010)
---------
  (0000) //Neither have the same bit

  (0011)
& (0010)
---------
  (0010) //both have bit 2

  (0101)
& (0110)
---------
  (0100) // Both have the 3rd bit

  (0111)
& (0110)
---------
  (0110) // Both have the 2nd and 3rd bit

对于false,C语言中的布尔值为0。任何非零都是真的。

这证明第1和第2位在数字3中可用。但是1和2没有匹配位。

查看按位运算符。为了更好地理解。

http://en.wikipedia.org/wiki/Bitwise_operation

答案 2 :(得分:0)

这是按位AND运算符。

  0011
& 0101
------
  0001

答案 3 :(得分:0)

event->buttons()可能会返回一个值,它是位的组合,其中每个位代表一个按钮。 Qt::LeftButton将是一个值,可能只在与“左键”对应的位置设置一个位。在这里使用按位AND(&)和这两个值的各个位,如果结果非零,则条件将被视为真。

由于Qt::LeftButton中只有一位,因此获得非零值的唯一方法是event->buttons()具有相同的位集。 (它也可能设置了其他位,但是当它们与Qt::LeftButton中的那些位置的零位进行AND运算时,它们会消失。实际上,表达式意味着“当且仅当event->buttons()包括由Qt::LeftButton“。

表示的位

答案 4 :(得分:0)

这是按位AND运算符。更好的问题是: AND运算符的作业在这里是什么?为什么我们在这里使用这种“低级”方法?

我们这里有一组标志。按住的按钮组由event->buttons()表示。这意味着,它是所有按钮的总和。但是每个按钮都是2的唯一幂,所以按下的所有按钮的总和是一组整数的位。我希望您理解这一点,因为这是我们如何在C / C ++中表示简单有限元素集的重要部分。

关键是,所谓的bitset中的每一位代表集合中的一个元素。那么每个元素都有一个唯一的数字,我们必须能够针对bitset进行测试(如果它包含在bitset中)。

如果要测试在事件期间是否按下左按钮,则必须检查该位是否在位集中设置。这是使用按位AND运算符完成的,因为它使用布尔AND运算将位操作数的所有位逐位组合。如您所知,当且仅当两个输入位都为真时,AND oepration才返回true。因此按位 AND操作用作输入位的掩码。右操作数“过滤掉”右操作数中存在的左操作数的位。

当且仅当值不等于零时,if条件被解释为true,这等于右操作数的位是否也出现在左操作数中的问题。在此具体方案中,这意味着:值Qt::LeftButton是否按位包含在值event->buttons()中,或者:Qt::LeftButton表示的位由event->button()表示的位集中包含?

或者只是简单地说:左按钮是否按下?