什么是按位操作?

时间:2013-04-23 06:17:50

标签: java bitwise-operators

我正在研究名为 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 个答案:

答案 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运算。