2012-09-13 106 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值的二進制表示。