什么是按位操作?

我正在研究名为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); 

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

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

AND运算符指定必须对要收取的结果收取信号A和B的费用。 因此,对字节10和6进行AND运算得到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 

它们被称为按位运算符 。

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的每个位的按位AND结果为0。

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

我想你可以先读一下java中运算符的一些基础知识。

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

带符号的左移运算符“<<”将位模式向左移位,带符号的右移运算符“>>”将位模式向右移位。 位模式由左侧操作数给出,以及由右侧操作数移位的位置数。

&被称为按位AND

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

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

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

相反,如果你把它向右移动一个地方,你会得到0b11111010或250.或者两个地方125。

在你的第二个例子中,你将数字0b111110100和%1010和“和”它们放在一起。 这给出0,因为和运算符只返回1表示两个都有1的位置,在你的情况下,没有。 有关更具说明性的示例,请尝试18和2.这给出了2.为什么? 好吧因为0b10010和0b10只有一个共同的1,所以这就是结果。