我正在研究名为 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?谁知道这里发生了什么?
答案 0 :(得分:8)
&安培;是按位运算符,而&&是条件运算符。你正在使用按位运算符。
AND运算符指定必须对要收取的结果收取信号A和B的费用。因此,对字节10和6进行AND运算得到2,如下所示:
a = 0000 1010 (10)
b = 0000 0110 (6)
---- ----
r = 0000 0010 (2) // a&b
有关更多示例,请参阅here:
按位和位移运算符
~ Unary bitwise complement
<< Signed left shift
>> Signed right shift
>>> Unsigned right shift
& Bitwise AND
^ Bitwise exclusive OR
| Bitwise inclusive OR
答案 1 :(得分:2)
他们被称为Bitwise Operators。
1
int i = 10 >> 500;
是10位乘以500的位右移的符号。在二进制数系统中,10可以表示为1010(在这种情况下忽略符号位)。将每个位右移500,将导致最终数字为0。
2
int i = 10 & 500;
是比特AND,10和500.10的位模式在二进制数系统中可以表示为1010和500为1 1111 0100(在这种情况下忽略符号位)。 0 0000 1010和1 1111 0100的每个位的按位AND结果为0。
您可以使用System.out.println(Integer.toBinaryString(number));
打印位模式并检查。
答案 2 :(得分:2)
为了理解按位运算符,使用基数为10的数字并不是很有用,但最好使用基数2(二进制)。
因此,在您的第一个示例中,您正在使用数字0b111110100并将其向右移动500个位置。这将留给你0。
如果您将它向右移动了一个地方,您将获得0b11111010或250.或者两个地方125.
在你的第二个例子中,你将数字0b111110100和%1010以及“和”它们放在一起。这给出0,因为和运算符只返回1表示两个都有1的位置,在你的情况下,没有。有关更具说明性的示例,请尝试18&amp;这给了2.为什么?好吧因为0b10010和0b10只有一个共同的1,所以这就是结果。
答案 3 :(得分:1)
我认为你可以先阅读operators in java的一些基础知识。
>>
这不是串联运算符,它在java中的移位运算符。
签名左移运算符“&lt;&lt;”将位模式向左移位,并使用带符号的右移运算符“&gt;&gt;”将位模式向右移动。位模式由左侧操作数给出,以及由右侧操作数移位的位置数。
&
被称为按位AND
按位&amp;运算符执行按位AND运算。