这是什么&运算符的意思是在这里吗?(What does this & operator mean h

2019-06-25 16:47发布

我读了一些教程的openGL的Qt中。 一个鼠标事件槽的中有这样的代码:

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

什么是与运营商的if语句吗? 是完全一样的==?

Answer 1:

它是不一样的== 。 它是按位与运算。 什么表达的作用是,它需要从返回值event->buttons()位与由所表示的值就是它Qt::LeftButton 。 如果所得到的值是非零的正被执行的块。

从本质上说,它会检查是否由指定的按钮Qt::LeftButton被按住。

为什么原因bitwise AND运算符这里使用的是一种叫做位掩码 。 它的意思是,返回值event->buttons()仅仅是这有它的位代表不同状态的值。 什么是与完成的和-运算符这里是,它会检查是否某些比特(表示为Qt::LeftButton )被设置为(1)或取消(0)中由返回的值event->buttons() 返回值是零,如果没有测试的位被设置,并且非零值,如果被测试的位中的至少一个被设置。

如何按位操作的更多细节做工可以在这里找到: 维基百科文章关于位运算



Answer 2:

将测试该值事件=>按钮()具有比特的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



Answer 3:

这是位AND运算符。

  0011
& 0101
------
  0001


Answer 4:

event->buttons()推测返回一个值,该值是比特的组合,其中每一位表示一个按钮。 Qt::LeftButton将是,可能有只是一个单一的位对应于“鼠标左键”的位置设置的值。 使用按位与(&)在这里与运算这两个值的各个位,如果结果不为零的条件下将被视为真。

由于只有一个比特Qt::LeftButton ,只有这样才能得到一个非零值,如果event->buttons()具有相同的位设置。 (这可能设置其他位过,但那些走时,他们在这些位置上的零位与运算Qt::LeftButton 。有效的话,表达的意思是“真当且仅当event->buttons()包括由表示的位Qt::LeftButton ”。



Answer 5:

这是按位与运算。 更好的问题是: 什么是的AND运算符这里的工作 我们为什么要使用这样的“低层次”的方法吗?

我们得到了一组标志在这里。 该组按住按钮由下式表示event->buttons() 这意味着,它是按住所有按钮的总和。 但是,每一个按钮是两个独特的电源,所以按住所有按钮的总和是一个整数的一组位。 我希望你能理解这一点,因为这是我们如何能代表简单套在C / C ++有限元素的重要组成部分。

问题的关键是,在所谓的bitset中的每一位代表在该组的一个元素。 因此,没有每个元素都有一个唯一的编号,这是我们必须要能够测试位集(如果它包含在此位集)。

如果你想测试左键是否被在活动期间举行了下来,你必须检查该位是否被bitset中设置。 这是使用按位与运算完成,因为这使用AND运算结合的操作数位的所有比特位。 正如你应该知道,与oepration返回true,当且仅当两个输入位的是真实的。 所以按位与运算工作作为输入位掩码 。 右操作数“过滤掉”左操作数是存在于右操作数的位。

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

或者干脆: 是左键按住?



文章来源: What does this & operator mean here?