我读了一些教程的openGL的Qt中。 一个鼠标事件槽的中有这样的代码:
if (event->buttons() & Qt::LeftButton) {
rotationX += 180 * dy;
rotationY += 180 * dx;
updateGL();
}
什么是与运营商的if语句吗? 是完全一样的==?
我读了一些教程的openGL的Qt中。 一个鼠标事件槽的中有这样的代码:
if (event->buttons() & Qt::LeftButton) {
rotationX += 180 * dy;
rotationY += 180 * dx;
updateGL();
}
什么是与运营商的if语句吗? 是完全一样的==?
它是不一样的==
。 它是按位与运算。 什么表达的作用是,它需要从返回值event->buttons()
和位与由所表示的值就是它Qt::LeftButton
。 如果所得到的值是非零的正被执行的块。
从本质上说,它会检查是否由指定的按钮Qt::LeftButton
被按住。
为什么原因bitwise AND
运算符这里使用的是一种叫做位掩码 。 它的意思是,返回值event->buttons()
仅仅是这有它的位代表不同状态的值。 什么是与完成的和-运算符这里是,它会检查是否某些比特(表示为Qt::LeftButton
)被设置为(1)或取消(0)中由返回的值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
用C语言布尔值false的0。 和任何非零是真实的。
这证明了第一和第二位数字3。然而,1和2都可以没有匹配位。
考虑位运算符。 以获得更好的理解。
http://en.wikipedia.org/wiki/Bitwise_operation
这是位AND运算符。
0011
& 0101
------
0001
event->buttons()
推测返回一个值,该值是比特的组合,其中每一位表示一个按钮。 Qt::LeftButton
将是,可能有只是一个单一的位对应于“鼠标左键”的位置设置的值。 使用按位与(&)在这里与运算这两个值的各个位,如果结果不为零的条件下将被视为真。
由于只有一个比特Qt::LeftButton
,只有这样才能得到一个非零值,如果event->buttons()
具有相同的位设置。 (这可能设置其他位过,但那些走时,他们在这些位置上的零位与运算Qt::LeftButton
。有效的话,表达的意思是“真当且仅当event->buttons()
包括由表示的位Qt::LeftButton
”。
这是按位与运算。 更好的问题是: 什么是的AND运算符这里的工作 ? 我们为什么要使用这样的“低层次”的方法吗?
我们得到了一组标志在这里。 该组按住按钮由下式表示event->buttons()
这意味着,它是按住所有按钮的总和。 但是,每一个按钮是两个独特的电源,所以按住所有按钮的总和是一个整数的一组位。 我希望你能理解这一点,因为这是我们如何能代表简单套在C / C ++有限元素的重要组成部分。
问题的关键是,在所谓的bitset中的每一位代表在该组的一个元素。 因此,没有每个元素都有一个唯一的编号,这是我们必须要能够测试位集(如果它包含在此位集)。
如果你想测试左键是否被在活动期间举行了下来,你必须检查该位是否被bitset中设置。 这是使用按位与运算完成,因为这使用AND运算结合的操作数位的所有比特位。 正如你应该知道,与oepration返回true,当且仅当两个输入位的是真实的。 所以按位与运算工作作为输入位掩码 。 右操作数“过滤掉”左操作数是存在于右操作数的位。
由于if
条件解释为真当且仅当值不为零,这等于右操作数的位是否也出现在左操作数的问题。 在本具体方案中,这意味着:是对值Qt::LeftButton
包含在值按位event->buttons()
或:是由表示的位Qt::LeftButton
包含在由所表示的位集event->button()
?
或者干脆: 是左键按住?