我是位操作符的新手,我不知道它们是用来做什么的,但我知道以下几点:
5 & 3 = 1因为
0101 & 0011 = 0001所以,是的,我知道我们将每个比特对相乘,比如1 x 0 = 0,1 x 1 = 1和0 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;
}好了,第一步,运算后action的值是多少,它是什么意思?为什么不简单地使用action = event.getAction(),这是什么意思。
其次,我从来没有见过使用{}为case:定义代码块是如此具体,因为我们使用的是逐位and运算符,或者这是完全正常的东西,而我恰好注意到您可以使用它们?
发布于 2013-07-10 05:36:55
屏蔽事件的原因是为了从事件中移除不相关的位。使用ACTION_MASK执行逐位and操作只会隔离那些特定的位。这就是如何组合和测试打包成整数的状态标志。如果您没有屏蔽它,那么如果在事件上设置了任何其他位,您将不能轻松地测试您的操作是否相等。
这实际上是为一个操作保留了少量的位,比如有一个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-10 05:36:36
从event.getAction()返回的事件实际上是一个整数。显然,它包含的不仅仅是有关操作类型的信息。它可能包含更详细地描述操作的标志。通过将所有细节传递给int,它省去了使用类对象来表示操作本身。
对于整数中的第一个字节,掩码是按位的。只有八个字节中的前两个字节。出于比较的目的,在将其与操作进行比较之前,您需要删除整数的上半部分,操作本身仅使用整数的底部字节。
事件整数的上半部分在进行检查时仍可用于其他用途。因此,掩码是0x000000ff,表示您只需要与底部的操作类型相关的信息,整个事件用其他有用的信息占据了它的其余部分。
https://stackoverflow.com/questions/17558593
复制相似问题