2012-08-13 186 views

回答

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中,有两种类型的语句。逻辑和和按位和。的逻辑和的形式如下:

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

语句// do something执行如果a认为可以解释为trueb认为可以被解释为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 
} 

您的代码上面走的是按位和两个值,然后解释,随着truefalse。我不知道SDL中使用的确切值,但假设SDL_BUTTON(1)的值为4SDL_BUTTON(2)的值为8SDL_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

+0

这是一个很好的答案。我仍然无法理解,但仅仅是因为这是一个难以理解的概念。谢谢! – Alidaco 2012-08-13 16:23:02

+0

改进的答案很棒!我现在完全理解一切! – Alidaco 2012-08-13 17:31:46