2011-12-14 16 views
8

私は3バイトの値DB(DB_1、DB_2、DB_3)を持っています。 特定のビットについてはDB_3をチェックする必要があります。たとえば、私は参照する必要があります DB_3 == 11X0XXXX ここでは、ビット4,6,7だけをチェックする必要があります。 Xとマークされたビットは任意の値を取ることができ、チェックしないでください。私はJavaでビット操作に精通していないと任意の助けに喜んでいる! ありがとう!バイトのJavaビット単位の比較

+1

http://en.wikipedia.org/wiki/Bitwise_operationを読むことをお勧めします。 –

答えて

20

あなたが特定のビットにマスキングを達成するためにビット単位のAND(Javaで&)を使用することができます(マスクが二行目であり、唯一の最初のこれらのビットをできるようになります

11101001 
& 11010000 
---------- 
    11000000 
    ↑↑ ↑ 

あなたは正確に両方のオペランドで1たこれらのビットを保持しますので、基本的にすべてのそれらのビットを設定し0にあなたに:マスク)[計算の下にある矢印の付い] 1を有する場合を通る線に興味がありません。

だから、あなただけの

if (DB_3 & 0xD0 == 0xC0) { ... } 

0xD0を行う必要がありますが、バイナリで11010000であり、あなたはそれが192、または11000000ある0xC0と一致するかどうかを知りたい208の16進形式です。あなたは、あなたが気にしていないビット(あなたの質問のX es)は、この時点でビット単位のANDのためにすでにゼロであることを知っています。


ETA(2011年12月14日午後2時24分):あなたはマスクがより容易に明らかになり

if (DB_3 & 0b11010000 == 0b11000000) { ... } 

を行うことができますので、どうやらJavaの7は、binary integer literalsを持っています。ありがとう、Glenn

+2

私はJava 7にバイナリリテラルがあると思います:http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html – Glenn

4

ジョーイの方法がうまく動作しますが、ここで私は個人的に、より直感的に感じていると思われ、それを行うための別の方法です。

DB_3の外観を定義するMASK1 = 11000000と、考慮するビットを定義するMASK2 = 11010000の2つのマスクが必要です。 1のビットがMASK2の場合、私たちが気にするビットを示し、0ビットは気にしないビットを示します。

MASK1で排他的論理和をとり、MASK2でANDを行い、結果がMASK2に等しいかどうかを確認します。最初の2つの操作では、とMASK1が一致する1が入ります。 3番目の操作では、で示されるビットを除いて、結果のすべての数字が0になります(MASK2)。この比較は、となり、が1sで示される位置でMASK1と一致する場合にのみ、MASK2になります。ビット演算の

int MASK1 = Integer.parseInt("11000000", 2); // tell parseInt to use base 2 
int MASK2 = Integer.parseInt("11010000", 2); 
boolean matches = (~(DB_3^MASK1) & MASK2) == MASK2; 

例:

11101001 
^ 11000000 
---------- 
    00101001 
~ 
---------- 
    11010110 
& 11010000 
---------- 
    11010000 

私はそれが理解できた願っています。

+0

私はおそらく追加します正確なビットマスクは 'parseInt'を使う代わりにコメントとして扱いますが、それは個人的な好みかもしれません(そして、コメントは古いかもしれません)。しかし、GrennはJavaにはバイナリリテラルが存在することが明らかになりました。 – Joey

+0

もし私がこれを "本当のために"行っていたなら、おそらく十進表現を計算し、 '208d = 11010000b'というコメントを追加するでしょう。ここでの 'parseInt'の使用は、ほとんどがわかりやすくするためのものでした。私は当時のこのようなコメントを使わないと思っていました... –

関連する問題