2

我正在研究名为《Beginning Android Games 》的书。我注意到的一件事是:

int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)
>> MotionEvent.ACTION_POINTER_ID_SHIFT;

这是我第一次看到这样的变量,所以我不知道它的作用。我在 java 中运行代码并创建了一些示例。

如果我运行此代码:

   int i = 10 >> 500;
System.out.print("Answer " + i); 

答案是0?这是为什么?

如果我运行这段代码:

int i = 10 & 500;
System.out.print("Answer  " + i);

起初我认为这是值的串联,所以我假设 i = 10500 但事实并非如此。答案是一样的。还是0?有谁知道这里发生了什么?

4

4 回答 4

11

& 是按位运算符,而 && 是条件运算符。您正在使用按位运算符。

AND 运算符指定必须对信号 A 和 B 都进行收费,才能对结果进行收费。因此,对字节 10 和 6 进行与运算得到 2,如下所示:

a = 0000 1010 (10)

b = 0000 0110 (6)
  ---- ----
r = 0000 0010 (2)  // a&b

有关更多示例,请参见此处:

按位和位移运算符

~       Unary bitwise complement
<<      Signed left shift
>>      Signed right shift
>>>     Unsigned right shift
&       Bitwise AND
^       Bitwise exclusive OR
|       Bitwise inclusive OR
于 2013-04-23T06:22:24.830 回答
3

它们被称为按位运算符

1.

int i = 10 >> 500;

是 10 位模式的有符号右移 500。在二进制数系统中,10 可以表示为 1010(在这种情况下忽略符号位)。将此处的每个位右移 500,将导致最终数字为 0。

2.

int i = 10 & 500;

是 10 和 500.10 的位模式的逐位与在二进制数系统中可以表示为 1010 和 500 为 1 1111 0100(在这种情况下忽略符号位)。0 0000 1010 与 1 1111 0100 的每一位按位与结果为 0。

您可以使用System.out.println(Integer.toBinaryString(number));打印位模式和检查。

于 2013-04-23T06:20:57.653 回答
2

为了理解位运算符,使用以 10 为底的数字并不是很有帮助,但最好使用以 2 为底的(二进制)。

因此,在您的第一个示例中,您正在获取数字 0b111110100 并将其向右移动 500 位。这会给你留下0。

相反,如果您将其右移一位,您将得到 0b11111010 或 250。或者两个位置 125。

在您的第二个示例中,您将使用数字 0b111110100 和 %1010 并将它们“与”在一起。这给出了 0,因为 and 运算符只为两个都有 1 的位置返回 1,而在你的情况下,没有一个。对于更说明性的示例,请尝试 18 和 2。这给出了 2。为什么?好吧,因为 0b10010 和 0b10 只有一个 1 相同,所以结果就是这样。

于 2013-04-23T06:41:56.673 回答
1

我认为您可以先阅读一些java 运算符的基础知识。

>>这不是连接运算符,它在 java 中的移位运算符。

有符号左移运算符“<<”将位模式左移,有符号右移运算符“>>”将位模式右移。位模式由左侧操作数给出,而要移位的位置数由右侧操作数给出。

&称为按位与

按位 & 运算符执行按位与运算。

于 2013-04-23T06:22:21.787 回答