0

我正在阅读有关 Java pacman 游戏的教程。

这是有问题的代码。

   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将检查第五位是 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

这不是布尔值,它始终是&&; 相反,它是按位和。它正在检查右边的第 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 | 210010二进制。

需要明确的是,&是位运算符。但是&&,如果两个操作数都为真,则返回真。

于 2012-09-18T08:32:40.487 回答
0

单与号是按位与运算符。

如果值是十六进制的,您可能会发现更容易“获取”。

于 2012-09-18T08:32:50.907 回答
0

按位与运算符&对两个整数的每一位执行“与”以确定结果。

所以:

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 回答