2

我是位运算符的新手,我不知道它们有什么用,但我知道以下内容:

5 & 3 = 1

因为

0101  & 0011 = 0001

所以是的,我知道我们将每个位对相乘1 x 0 = 0,例如1 x 1 = 10 x 0 = 0

现在谈到编码,我找到了以下代码onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch(action) {
    case MotionEvent.ACTION_DOWN : {
        break;
    }

    case MotionEvent.ACTION_MOVE : {
        break;
    }

    case MotionEvent.ACTION_POINTER_DOWN : {
        break;
    }

    case MotionEvent.ACTION_POINTER_UP : {
        break;
    }

    case MotionEvent.ACTION_UP : {
        break;
    }  
}
return true;
}

Ok firstable,操作后的部分int action = event.getAction() & MotionEvent.ACTION_MASK;是什么值,action是什么意思?为什么不只是简单地使用action = event.getAction()什么意思。

其次,我从未见过使用{}为 a 定义代码块case:是这样的,因为我们使用的是按位和运算符,或者这是完全正常的事情,我碰巧注意到你可以使用它们?

4

2 回答 2

4

事件被屏蔽的原因是从事件中删除不相关的位。按位和 with 执行ACTION_MASK仅隔离那些特定位。这是您组合和测试打包成整数的状态标志的方式。如果您没有屏蔽它,那么如果在事件上设置了任何其他位,您将无法轻松测试您的操作是否相等。

这实际上是在为操作保留少量位,例如具有 3 位整数(或实际上是什么)。掩码只是设置相关位,因此所有其他位都被丢弃(不重要)。

至于case语句中的大括号,没关系。您可以在任何地方放置大括号 - 它创建一个块范围级别,您在该块内创建的任何新变量都将仅存在于该块中。在case语句中这是很正常的,并且可以防止一个变量case“落入”后续情况。例如:

switch(foo)
{
    case 0:
       int i = 42;
       // do something with i
       break;

    case 1:
       // The variable i is still in scope here, which is often not
       // intentional (but can sometimes be useful)
}

停止i跌倒:

switch(foo)
{
    case 0:
       {
           int i = 42;
           // do something with i
       }
       break;

    case 1:
       // The variable i defined above is not available here.
}

在您的情况下,大括号是多余的,但可能是因为编写代码的人已将这种做法纳入他们的编码风格。很可能他们之前已经被不需要的副作用烧毁了,或者他们的编译器发出了关于变量失败的警告,他们决定一直使用大括号。就个人而言,我认为仅在必要时使用它们会更清洁。

于 2013-07-09T21:36:55.283 回答
1

返回的事件event.getAction()实际上是一个整数。它显然不仅仅包含有关操作类型的信息。它可能包含更详细地描述操作的标志。并且通过一个 int 传递所有这些细节,它节省了使用类对象来表示动作本身。

对于整数中的第一个字节,掩码是按位的。八个字节中只有前两个字节。出于比较目的,您需要在将整数与操作进行比较之前删除整数的上半部分,这些操作本身仅使用整数的底部字节。

事件整数的上半部分在检查它们时仍可用于其他目的。所以掩码是 0x000000ff 表示您只需要与底部的操作类型相关的信息,而整个事件将其余部分与其他有用信息一起占用。

于 2013-07-09T21:36:36.257 回答