我正在閱讀一些關於qt中openGL的教程。 鼠標事件槽的一個具有此代碼是:這和操作符在這裏表示什麼?
if (event->buttons() & Qt::LeftButton) {
rotationX += 180 * dy;
rotationY += 180 * dx;
updateGL();
}
什麼是&操作if語句呢? 和==完全一樣嗎?
我正在閱讀一些關於qt中openGL的教程。 鼠標事件槽的一個具有此代碼是:這和操作符在這裏表示什麼?
if (event->buttons() & Qt::LeftButton) {
rotationX += 180 * dy;
rotationY += 180 * dx;
updateGL();
}
什麼是&操作if語句呢? 和==完全一樣嗎?
它與==
不一樣。它是按位運算符AND。表達式的作用是它將event->buttons()
和的返回值按位與和的值與Qt::LeftButton
代表的值相比較。如果結果值不爲零,則塊正在執行。
實質上,它檢查按鈕Qt::LeftButton
指定的按鈕是否被按下。
此處使用bitwise AND
運算符的原因是所謂的位掩碼。這意味着event->buttons()
的返回值只是一個值,它的位代表不同的狀態。 & -operator在這裏完成的是,它檢查在由event->buttons()
返回的值中是否設置了(1)或未設置(0)某些位(由Qt::LeftButton
表示)。如果未設置測試位,則返回值爲零;如果至少有一個測試位置位,則返回值爲非零值。的操作如何按位工作
更多細節可以在這裏找到:Wikipedia article about Bitwise operations
這是位AND運算符。
0011
& 0101
------
0001
event->buttons()
想必返回一個值,該值是比特的組合,其中每一位表示一個按鈕。 Qt::LeftButton
將會是一個值,可能只有一個位設置在對應於「左鍵」的位置。在這裏使用按位AND(&)與這兩個值的各個位進行比較,如果結果不爲零,則該條件將被視爲真。
由於Qt::LeftButton
中只有一位,獲得非零值的唯一方法是event->buttons()
具有相同的位集。 (它也可以設置其他位,但是當它們與Qt::LeftButton
中的那些位置的零位進行AND操作時,這些位將消失。實際上,當且僅當event->buttons()
包括由Qt::LeftButton
代表的位時,表達式意味着「真」。
這將測試該值事件=>按鈕()具有比特的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語言的布爾值爲0表示爲false。而且任何非零都是真的。
這證明第1位和第2位在數字3中可用,但是1和2沒有匹配位。
研究按位運算符。以獲得更好的理解。
這是按位與運算。更好的問題是:這裏AND運算符的作業是什麼?爲什麼我們在這裏使用這種「低級」方法?
我們在這裏得到了一組標誌。按下的一組按鈕由event->buttons()
表示。這意味着,它是所有按鈕的總和。但每個按鈕都是兩個獨特的冪,所以按下的所有按鈕的總和就是一組整數位。我希望你能理解這一點,因爲這是我們如何在C/C++中表示簡單的有限元素集的基本部分。
問題是,所謂bitset中的每一位代表集合中的一個元素。那麼每個元素都有一個唯一的編號,我們必須能夠對比特集進行測試(如果它包含在比特集中)。
如果要測試事件期間是否按住左按鈕,則必須檢查該位是否設置在位集中。這是通過使用按位AND運算符來完成的,因爲它使用布爾AND操作將操作數位的所有位按位組合。正如你應該知道的那樣,當且僅當兩個輸入位都爲真時,AND操作才返回true。所以按位 AND操作的輸入位爲掩碼。右操作數「過濾掉」出現在右操作數中的左操作數的位。
由於if
條件被解釋爲真,當且僅當該值不等於零時,這等於右操作數的位是否也出現在左操作數中的問題。在這種具體的情況下,這意味着:值Qt::LeftButton
按位值包含在值event->buttons()
中,或者:由event->button()
表示的位集中包含的Qt::LeftButton
表示的位是否爲?
或者簡單地說:是否按住左鍵?
作爲與==不同的一個實際例子,我想還有Qt :: RightButton,Qt :: MiddleButton等。這些都會有不同的按位可組合的值。 Qt :: AnyMouseButton可能等於Qt :: RightButton | Qt :: LeftButton | Qt的:: MiddleButton。您可以執行位掩碼操作以查看是否設置了這些操作的組合。或者在原始問題的示例中,如果有多個按鈕與事件關聯,則可以檢查LeftButton是否已關閉,即使該事件也指示RightButton也被按下。 –
非常感謝!這是非常豐富的!因此,如果我使用==而不是&here,它會執行與&相同的工作嗎?還是隻是返回false,因爲按位它們不一樣?抱歉沒關係,我知道了〜 – user1475966