2012-03-10 20 views
2

私はバイト配列、すなわちをバイト[0]からバイト[2]まで持っています。私は最初にバイト[0]を8ビットに分割したいと思います。その後、バイト[1]と最終的にバイト[2]。分割することによって、もしbyte [0] = 12345678なら、変数A = 8、変数B = 7、変数C = 6、変数D = 5、........変数H = 0 。どのようにバイトを分割し、ビットを変数に格納するのですか?私はJAVAでこれをしたいバイトをビットに分割する

+1

@Samir:。。おかげサミル代わりに、編集の – suraj

+0

あなたは 'Integer.toBinaryString(your_byte_value)'を試しましたか? – waqaslam

+0

あなたはこう言っています: "私はあなたが私の質問に答えたなら、 0] = 12345678 "、バイトの変数は' 12345678'の値を持ち、sunの指定ではバイトは '-128'から' 127'です。 – MJM

答えて

5

よくビット単位の操作はあなたが話しているものとほとんど同じようです。 バイトは8ビットで構成され、そしてそれは00000000 11111111へ

ビットごとの演算は、できるだけ多くの情報を得るために基本的にマスクを使用するものであるのバイナリで書かれた255 に0の怒りに行きますバイトから

たとえば、1101 0011バイト(可視性のためだけにスペースが追加されています)= 211(10進数)です。これを半分のバイトの2つの "変数" b1とb2に分割することができます。 0〜15の範囲をカバーします。

どのようにするかは、いくつかのマスクを定義することです。最初のハーフバイト値を取得するマスクは0000 1111になります。 11010011の値を取ると、ビット単位で(&)演算子が適用されます。 バイトb = 211と言っています。バイトマスク1 = 15; ORバイトb = 0x11010011;バイトマスク= 0x00001111; 次に、可変バイトb1 = b & mask1;

したがって、この操作を適用すると、b1 = 00000011 = 3となります。 マスクバイトmask2 = 0x11110000の場合。同じ操作をbに適用すると、バイトb2 = mask2となります& b = 0x11010000;

もちろん、数字b2はおそらく大きすぎます。あなたが値0x1101をつかみたいのであれば、それを右にシフトするだけです。したがって、b2 >> = 4;

マスクはどのような形でも使用できますが、2の桁数で10進数にしておくことで(バイトから任意のビットを取り出すことができるように)、または変数に必要な範囲を決めてマスクは0x00000011のような「大きい」、またはox00001100のようになります。これらの2つのマスクはそれぞれ、1つのバイトから2つの値を取得し、各値は0から3の範囲で、4つの値を1つのバイトの内側に収めることができます。

詳細については、relevant wikiをご覧ください。

バイトは-128から127に行くようですが、考え方は同じであるので、申し訳ありませんが、値が(少しオフだった。

セカンド編集(自分が笑ビット演算を使用したことがありません)... " 。0X」あなたが実際に実際に何を意味するのか01001111自分のために計算する必要がありますので表記は...十六進のためにかなり嫌です:|それはトリックを行うつもりだ

0
boolean a = (theByte & 0x1) != 0; 
boolean b = (theByte & 0x2) != 0; 
boolean c = (theByte & 0x4) != 0; 
boolean d = (theByte & 0x8) != 0; 
boolean e = (theByte & 0x10) != 0; 
boolean f = (theByte & 0x20) != 0; 
boolean g = (theByte & 0x40) != 0; 
boolean h = (theByte & 0x80) != 0; 
+0

ほんの少しのコメント:0ではなく1と照合する必要がありますか? –

+0

@BorisStrandjev彼は0x80と0x80がまだ0x80なので、> 0をチェックするべきです。 – AlanFoster

+0

または!= 0実際に。 2人のうちのどちらがもっと速くなるのかはわかりません... –

関連する問題