0

可能重复:
这里的 & 运算符是什么意思?

为什么这个 if 语句中的 & 就在宏 SDL_BUTTON 之前?它有什么作用?帮助我理解这段代码的作用。

if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1))
    //code to be executed
4

1 回答 1

7

这是一个按位“与”运算,将 的结果与 的结果“SDL_GetMouseState(NULL, NULL)与” SDL_BUTTON(1)

也就是说,结果是一个整数值,其中两个答案中为 1 的所有位将在最终结果中为 1。

实际上,这是检查当前是否按下了 SDL_BUTTON(1)。他们这样做而不是 == 比较,因为即使在与其他同时按下鼠标的同时按下按钮 1 时,这也会评估为真。

按位与澄清

假设我有以下内容:int foo = 25; 我可以在几个不同的基础上查看它。正常基数为 10(十进制);我们通常在日常生活中查看数字的基础。以 10 为底,这个数字是25。我还可以查看以 2 为底的数字(二进制​​)。在二进制中,数字表示为11001。该数字可以解释为具有几位“真”(1)和几位“假”(0)。“真”位都获得与其在列中的位置相关联的固定值。每列都有一个值 2^i,其中 i 是列的索引。列从右到左编号,最右边的列编号为 0。

Truth value:     1    1    0    0    1
Column value:   16    8    4    2    1

我们为所有为真的列取列值并将它们加在一起以获得该值。在这种情况下,我们将把 1、8 和 16 加在一起,因为它们在为真的列中。1 + 8 + 16 = 25。

我们也可以对二进制数执行其他操作,例如“按位与”。在 C 中,有两种类型的 and 语句。逻辑与和位与。一个合乎逻辑的 and 采用以下形式:

if (a && b) { // two & together is logical-and
   // do something
}

如果持有一个可以解释为的值并且持有一个可以解释为的值,// do something则执行该语句;对于整数,所有非零数都是. 如果其中一个为假,则不执行该语句。atrue btruetrue

按位和类似,但在位级别上操作。它采用两个值并一次将它们进行一位比较以确定输出值。如果该位在两个值中都为真,则输出中的该位也为真。如果该位在任一值中为假,则输出中的该位为假。

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
}

您上面的代码采用两个值的按位和,然后将其解释为truefalse。我不知道 SDL 中使用的确切值,但假设它SDL_BUTTON(1)是 的 值4SDL_BUTTON(2)的值8SDL_GetMouseState(NULL, NULL)将返回一个整数,其中每个位代表一个标志。如果SDL_GetMouseState(NULL, NULL)返回4(鼠标按钮 1 按下),则为4 & 44 ( 0100 & 0100 == 0100)。如果它返回8(鼠标按钮 2 按下),则为8 & 40(01000 & 00100 == 00000; 没有1共同的列)。如果返回 12(鼠标按钮 1 和 2 按下),则返回12 & 44 ( 01100 & 00100 == 00100)。

如果按下鼠标按钮 1,则 的结果&将非零,即true。如果按下鼠标按钮 1 并按下鼠标按钮 2,结果仍然 true是。

于 2012-08-13T16:13:04.380 回答