为什么这个if语句?

Ali*_*aco 0 c++ syntax sdl if-statement

可能重复:
这个&运营商在这里意味着什么?

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

if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1))
    //code to be executed
Run Code Online (Sandbox Code Playgroud)

Nat*_*han 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
Run Code Online (Sandbox Code Playgroud)

我们获取所有列为true的列值,并将它们一起添加以获取值.在这种情况下,我们将一起添加1,8和16,因为它们位于真实的列中.1 + 8 + 16 = 25.

我们也可以对二进制数执行其他操作,例如"按位和".在C中,有两种类型的和语句.逻辑和按位和.符合逻辑并采取以下形式:

if (a && b) { // two & together is logical-and
   // do something
}
Run Code Online (Sandbox Code Playgroud)

// do something如果a保存可以解释为的值true 并且 b保存可以解释为的值,则执行该语句true; 对于整数,所有非零数字都是true.如果其中一个为false,则不执行该语句.

按位和类似,但在位级操作.它需要两个值并一次比较它们以确定输出值.如果两个值中的位均为真,则输出中的位也为真.如果任一值中的位为false,则输出中的位为false.

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
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是按位和两个值,然后将其解释为truefalse.我不知道SDL中使用的确切值,但我们可以说它是SDL_BUTTON(1)一个值,4并且SDL_BUTTON(2)值为8. SDL_GetMouseState(NULL, NULL)将返回一个整数,其中每个位代表一个标志.如果SDL_GetMouseState(NULL, NULL)返回4(鼠标按钮1已关闭),4 & 4则将为4(0100 & 0100 == 0100).如果它返回8(鼠标按钮2关闭),那么8 & 4将为0(01000 & 00100 == 00000;没有1共同的列).如果它返回12(鼠标按钮1和2向下),那么12 & 4将是4(01100 & 00100 == 00100).

如果按下鼠标按钮1,则结果&将为非零,即true.如果鼠标按钮1被按下鼠标按钮2被按压,其结果是静止 true.