为什么&在这个if语句?

时间:2012-08-13 16:09:05

标签: c++ syntax if-statement sdl

  

可能重复:
  What does this & operator mean here?

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

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

1 个答案:

答案 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

上面的代码采用按位和两个值,然后将其解释为falseSDL_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}}。