无法理解代码,特别是&

时间:2012-09-18 08:30:35

标签: java bit-manipulation

我正在阅读有关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);
            ...
        }

我并不是真的了解单身&amp ;.我理解这个操作数检查if语句的两侧,或者是一个按位运算符。但是,根据以下测试,它似乎不是:

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

感谢

7 个答案:

答案 0 :(得分:8)

&bitwise operator AND:

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


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

因此if将检查第五位是1还是0。

答案 1 :(得分:2)

&它是bitwise AND。这是对您的号码的个别位执行的操作。

考虑您的短片的可能位代表:

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

特别是这一行:

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

检查你的号码的第5位(2 ^(5 -1))是否设置为1(不同于0)。

答案 2 :(得分: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

答案 3 :(得分:0)

给定ch = 18

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

似乎是对的。什么是二进制18?二进制文件中的16 | 210010

要清楚,&是一个按位运算符。但是,如果两个操作数都为真,则&&返回true。

答案 4 :(得分:0)

单个&符号是一个按位AND运算符。

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

答案 5 :(得分:0)

按位和运算符&在两个整数的每个位上执行“和”以确定结果。

所以:

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

答案 6 :(得分:0)

&安培;是按位运算符AND。您可以在http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

中查看详细信息