我正在阅读有关qt中openGL的一些教程。 其中一个鼠标事件槽中包含以下代码:
if (event->buttons() & Qt::LeftButton) {
rotationX += 180 * dy;
rotationY += 180 * dx;
updateGL();
}
&运算符在if语句中做什么? 它与==?
完全相同答案 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没有匹配位。
查看按位运算符。为了更好地理解。
答案 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()
表示的位集中包含?
或者只是简单地说:左按钮是否按下?