为什么&在宏SDL_BUTTON之前的if语句中?它有什么作用?帮助我理解这段代码的作用。
if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1))
//code to be executed
答案 0 :(得分:7)
这是一个按位“和”操作,将SDL_GetMouseState(NULL, NULL)
和“和”它的结果视为SDL_BUTTON(1)
的结果。
也就是说,结果是一个整数值,其中两个答案中1的所有位在最终结果中都是1。
实际上,这是检查当前是否按下了SDL_BUTTON(1)。他们这样做而不是==比较,因为即使与其他同时按下鼠标一起按下按钮1,这也会评估为真。
按位和澄清
说我有以下内容:int foo = 25;
我可以在几个不同的基础上查看。正常基数为10(十进制);我们通常在日常生活中看待数字的基础。在基数10中,此数字为25
。我还可以查看基数2(二进制)中的数字。在二进制中,数字表示为11001
。该数字可以解释为具有几个比特“真”(1)和几个比特“假”(0)。 “true”位都获得与它们在列中的位置相关联的固定值。每列的值为2 ^ i,其中i是列的索引。列从右到左编号,最右边的列为数字0。
Truth value: 1 1 0 0 1
Column value: 16 8 4 2 1
我们获取所有列为true的列值,并将它们一起添加以获取值。在这种情况下,我们将一起添加1,8和16,因为它们位于真实的列中。 1 + 8 + 16 = 25。
我们也可以对二进制数执行其他操作,例如“按位和”。在C中,有两种类型的和语句。逻辑和按位和。合乎逻辑并采取以下形式:
if (a && b) { // two & together is logical-and
// do something
}
如果// do something
包含的值可以解释为a
且 true
包含的值可以是b
,则会执行true
语句解释为true
;对于整数,所有非零数字都是int a = 25; // 011001
int b = 13; // 001101
int c = a & b; // 001001 -- or 1 + 8 == 9
if (c) {
// do something if c is non-zero
}
。如果其中一个为假,则不执行该语句。
按位并且类似,但在位级操作。它需要两个值并一次比较它们以确定输出值。如果两个值中的位均为真,则输出中的位也为真。如果任一值中的位为false,则输出中的位为false。
true
上面的代码采用按位和两个值,然后将其解释为false
或SDL_BUTTON(1)
。我不知道SDL中使用的确切值,但是假设4
的值为SDL_BUTTON(2)
而8
的值为SDL_GetMouseState(NULL, NULL)
。 SDL_GetMouseState(NULL, NULL)
将返回一个整数,其中每个位代表一个标志。如果4
返回4 & 4
(鼠标按钮1已关闭),则0100 & 0100 == 0100
将为4(8
)。如果它返回8 & 4
(鼠标按钮2已关闭),则01000 & 00100 == 00000
将为0(1
;没有共有12 & 4
的列。如果它返回12(鼠标按钮1和2已关闭),则01100 & 00100 == 00100
将为4(&
)。
如果按下鼠标按钮1,则true
的结果将为非零,即true
。如果按下鼠标按钮1 并按下鼠标按钮2,则结果仍然 {{1}}。