0

JavaのBitwise 演算子を使用しようとしていますが、誤用していると思います。以下の例を使用すると、messageAddressが7の場合、条件1と条件3の両方が満たされます。7のmessageAddressは、最初の条件ではなく3番目の条件を満たしているべきではありませんか?7のmessageAddressが最後の条件を満たすように以下のロジックを変更する方法についてのアイデアはありますか?

    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
                }
4

4 に答える 4

4

ビット単位のマスクを有効にするには、2の累乗を使用する必要があります。

3 = 1 | 2、したがって、任意のx & 3 != 0、、x & 1 != 0およびx & 2 != 0

もう少し詳しく説明すると、7は1 + 2 + 4または、バイナリでは111。1ビットがハイであることに注意してください(したがって、7&1 == 1)。

于 2012-09-13T23:56:10.247 に答える
2

現状では、condition 1はすべて奇数でありcondition 2、2番目に最下位ビットがオンになっているすべての数値でありcondition 3、1と2の組み合わせです。

本当に必要なのは、最下位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には2つの役割がありますMASK。これは最後の2ビットのみをフィルタリングするためのビットマスクとして使用されます。SHIGHこれは、チェックする最後の2ビットの可能な値の1つです。

ところで、チェーン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;
}
于 2012-09-13T23:59:27.917 に答える
1
  111 (=7)
& 001 (=1)
----------
  001 (=1)

メソッドごとにint値のバイナリ表現を確認できますInteger.toBinaryString

于 2012-09-13T23:58:55.273 に答える
1

のバイナリ表現7111(注意、すべてのもの)です。したがって、7 & ANYTHING == ANYTHINGは常にtrue以下または以上の値に対して7戻り0ます。例7 & 3

111&011

1番目のビット:0(1&0)
2番目のビット:1(1&1)
3番目のビット:1(1&1)

2番目の引数を再び受け取る方法に注意してください。

于 2012-09-13T23:58:19.367 に答える