2

私はビットごとの演算子を初めて使用します。何に使用するのかわかりませんが、次のことは知っています。

5 & 3 = 1

なぜなら

0101  & 0011 = 0001

ええ、私は各ビットペアを次のように乗算することを理解して1 x 0 = 01 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;
}

まず最初に、操作後int action = event.getAction() & MotionEvent.ACTION_MASK;の値はaction何ですか?それはどういう意味ですか? 単にaction = event.getAction()意味を使用しないのはなぜですか。

{}第二に、 a のコード ブロックを定義するために を使用するのを見たことがありません。これcase:は、ビットごとの and 演算子を使用しているためです。または、これは完全に正常なことであり、それらを使用できることに気づきましたか?

4

2 に答える 2

4

イベントがマスクされる理由は、イベントから無関係なビットを削除するためです。ビット単位の AND を実行すると、ACTION_MASK特定のビットのみが分離されます。これは、整数にパックされたステータス フラグを組み合わせてテストする方法です。マスクしなかった場合、イベントに他のビットが設定されていると、アクションが等しいかどうかを簡単にテストできなくなります。

これが実際に行っていることは、3 ビットの整数 (またはそれが実際に何であれ) を持つように、アクションのために少数のビットを予約することです。マスクは関連するビットを設定するだけなので、他のすべてのビットは破棄されます (つまり、重要ではありません)。

case ステートメントの中括弧については、それで問題ありません。中括弧はほぼどこにでも配置できます。これにより、ブロック スコープ レベルが作成され、そのブロック内に作成した新しい変数はブロック内にのみ存在します。ステートメントでは、これはごく普通のことであり、1 つの変数が後続のケースに「フォールスルー」する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 を介して渡すことで、クラス オブジェクトを使用してアクション自体を表す必要がなくなります。

マスクは、整数の最初のバイトに対してビット単位です。8 バイトのうち最初の 2 バイトのみ。また、比較のために、整数の下位バイトのみを使用するアクションと比較する前に、整数の上位部分を削除する必要があります。

イベント整数の上位部分は、それらに対してチェックするときに、他の目的にも役立ちます。したがって、マスクは 0x000000ff であり、下部のアクション タイプに関連する情報のみが必要であり、イベント全体がその他の有用な情報と共に残りを占有することを表します。

于 2013-07-09T21:36:36.257 に答える