2012-09-13 40 views
0

我正在尝试使用java的Bitwise &运算符,我想我滥用它。使用下面的例子,在messageAddress为7时,满足条件1和条件3。 7的messageAddress不应该满足第三个条件,而不是第一个?有关如何更改以下逻辑的任何想法,以便7的messageAddress只能满足最后一个条件?Java按位与运算符匹配多个条件

public static final int SLOW = 1; 
    public static final int SMEDIUM = 2; 
    public static final int SHIGH = 3; 
     String messageAddressHex="7"; 
     int messageAddress = Integer.parseInt(messageAddressHex, 16); 
     if ((messageAddress & SLOW) == SLOW) { 
        //condition 1 met logic 
       } else if ((messageAddress & SMEDIUM) == SMEDIUM) { 
        //condition 2 met logic 
       } else if ((messageAddress & SHIGH) == SHIGH) { 
        //condition 3 met logic 
       } 
+3

我建议使用,而不是十进制数二进制数,这样它更容易看到你的位操作是如何去上班。只是使用2的幂,这将简化事情。 –

+2

(我发现十六进制文字更好;比小数更容易处理,因为它们与位对齐,并且它们在Java中被支持为文字,否则,必须“parseInt(binary,2)”或类似的位移位。方便,但:'1 << 3',例如) – 2012-09-13 23:58:59

回答

2

,因为它是condition 1是所有的奇数,condition 2是所有与他们的第二个最显著位接通的号码,condition 3是和1组合2

我假设你真正想要的是检查两个最低显著位为0和3之间的数字。如果是那样的话,你应该使用:

if ((messageAddress & SHIGH) == SLOW) { 
    //condition 1 met logic 
} else if ((messageAddress & SHIGH) == SMEDIUM) { 
    //condition 2 met logic 
} else if ((messageAddress & SHIGH) == SHIGH) { 
    //condition 3 met logic 
} 

编辑:
这是一个更好的设计声明另一个常数位掩码:

public static final int MASK=3; 

然后我们可以这样写:

if ((messageAddress & MASK) == SLOW) { 
    //condition 1 met logic 
} else if ((messageAddress & MASK) == SMEDIUM) { 
    //condition 2 met logic 
} else if ((messageAddress & MASK) == SHIGH) { 
    //condition 3 met logic 
} 

数3有两个作用 - MASK,它被用作位掩码只有最后两个位,SHIGH过滤 - 这是您想检查的最后两位的可能值之一。

顺便说一句,现在你可以使用一个switch-case声明,而不是if-else-if链:

switch (messageAddress & MASK) { 
    case SLOW: 
     //condition 1 met logic 
     break; 
    case SMEDIUM: 
     //condition 2 met logic 
     break; 
    case SHIGH: 
     //condition 3 met logic 
     break; 
} 
+0

在按位比较中使用SHIGH值的意义是什么?我不太明白为什么这会起作用 – c12

+1

那么,将另一个常量定义为3可能会更好,并将其用作所有比较的位掩码(我将在答案中对其进行更新)。无论如何,按位返回所有在两个操作数中打开的位。数字3是二进制00000011,所以做一个按位和3将返回最后两位。这样做后,条件会检查最后两位是否为01,10或11.如果执行按位并使用“SLOW”或“SMEDIUM”,则只检查最低位或次低位。因此,如果最后两位打开,则条件1和条件2都会生成真值。 –

4

对于位掩码有效,您需要使用两个幂。

3 = 1 | 2,因此对于任何x & 3 != 0x & 1 != 0x & 2 != 0

为了更详细地解释,7是1 + 2 + 4或者二进制,111。请注意,1位为高位(因此为7 & 1 == 1)。

1

7的二进制表示形式为111(注意,全部为1)。因此,对于小于或等于7且大于或等于0的任何东西,7 & ANYTHING == ANYTHING将始终返回true。例如,7 & 3

首先位:0(1 & 0)
第二位:1(1 & 1)
第三位:1(1 & 1)

请注意,您只是再次收到第二个参数。

1
111 (=7) 
& 001 (=1) 
---------- 
    001 (=1) 

您可以通过Integer.toBinaryString方法检查int值的二进制表示。