0

Javaパックマニアゲームに関するチュートリアルを読んでいます。

これが問題のコードです。

   if (pacmanx % blocksize == 0 && pacmany % blocksize == 0) {
        pos = // integer         
        ch = screendata[pos];

        if ((ch & 16) != 0) { // do not understand this.
            screendata[pos] = (short)(ch & 15);
            ...
        }

私はシングル&を本当に理解していません。このオペランドがifステートメントの両側をチェックするか、ビット演算子であることを理解しています。ただし、以下のテストによると、次のいずれでもないようです。

if I was to test (ch = 18):
(ch & 16) = 16
(ch & 8) = 0
(ch & 2) = 2

ありがとう

4

7 に答える 7

8

&ビット演算子AND :

18 = 10010
16 = 10000
----------
16 = 10000


18 = 10010
 8 = 01000
----------
 0 = 00000

したがって、ifは5番目のビットが1か0かをチェックします。

于 2012-09-18T08:32:45.470 に答える
2

シングル&それはビット単位 ANDです。これは、番号の個々のビットに対して実行される操作です。

あなたのショートの可能なビット表現を考えてみましょう:

10011011 &   : screendata[pos]
00010000 =   : 16
----------
10010000

具体的にはこの行:

if ((ch & 16) != 0) {

番号の5番目のビット(2 ^(5 -1))が1(0とは異なる)に設定されているかどうかを確認します。

于 2012-09-18T08:33:02.863 に答える
2

これは常にブール値の and ではありません&&。代わりに、ビット単位の and です。右から5ビット目がセットされているかどうかをチェックしていますch

ch = 18  //      ch = 0b00010100
ch & 16  //      16 = 0b00010000
         // ch & 16 = 0b00010000 != 0
ch & 8   //       8 = 0b00001000
         // ch &  8 = 0b00000000 == 0
ch & 2   //       2 = 0b00000010
         // ch &  2 = 0b00000010 != 0
于 2012-09-18T08:34:51.377 に答える
0

与えられたch = 18

(ch & 16) = 16
(ch & 8) = 0
(ch & 2) = 2

正しいようです。バイナリの18は何ですか?16 | 2または10010バイナリで。

明確にするために、&はビット演算子です。ただし&&、両方のオペランドがtrueの場合はtrueを返します。

于 2012-09-18T08:32:40.487 に答える
0

単一のアンパサンドはビット単位のAND演算子です。

値が16進数の場合、「取得」する方が簡単な場合があります。

于 2012-09-18T08:32:50.907 に答える
0

ビットごとの and 演算子&は、2 つの整数の各ビットに対して "and" を実行して結果を決定します。

そう:

18 = 0001 0010
16 = 0001 0000
18&16 = 0001 0000

于 2012-09-18T08:34:28.637 に答える
0

& はビット演算子 AND です。詳細はhttp://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.htmlで確認できます

于 2012-09-18T08:36:24.990 に答える