-5

重複の可能性:
Java でのビット単位操作に関する優れたチュートリアル
&、|、^ はビット単位演算子ですか、それとも論理演算子ですか?

以下のようにコードします。

int rgb[] = new int[] {     
(argb >> 16) & 0xff, //red     
(argb >>  8) & 0xff, //green     
(argb      ) & 0xff  //blue 
}; 

INT 値から RGB 値を取得するコードを見ました。操作は上記のとおりですが、そのような操作は前に見たことがありません。それらが何であり、何ができるかについての詳細を知りたいです。記号 >> と &および 0xff。

では、皆さんは Java でそれらにどのように対処しますか?

4

2 に答える 2

5

ビット演算の詳細説明。int ビットが次のようになっているとします。

00000000 10101010 01010101 11011011
unused   red      green    blue

青の int 値を取得するには、下位 8 以外のすべてのビットをオフにする必要があります。これを行う簡単な方法は、ビットごとの AND を使用することです。0xff は、上位 24 ビットを 0 に設定し、既に 1 に設定されている下位 8 ビットのみをオンにする 0x000000ff として書き込むこともできます。

argb & 0xff ==> 00000000 00000000 00000000 11011011
                                           blue

argb >> 8 ==> 00000000 00000000 10101010 01010101 
                                red      green
(argb >> 8) & 0xff ==> 00000000 00000000 00000000 01010101 
                                                  green

argb >> 16 ==> 00000000 00000000 00000000 10101010
                                          red
(argb >> 16) & 0xff ==> 00000000 00000000 00000000 10101010
                                                   red

赤の値の & 0xff は不必要に思えますが、呼び出し元が上位の未使用ビットの一部を設定していない可能性があるという保証はないため、安全を確保してそれらをすべてオフにする必要があります。

于 2012-08-14T04:07:19.853 に答える
2
int rgb[] = new int[] {     
(argb >> 16) & 0xff, //red     
(argb >>  8) & 0xff, //green     
(argb      ) & 0xff  //blue 
};

>>: 算術右シフト。符号付きシフトとも呼ばれます。

&: ビットごとの AND

0x....: 16 進数。

しかし、それは何をしているのですか?

(argb >> 16) & 0xff16 ビットの値を右シフトしargb、ビット単位の AND 演算を実行して 8 ビットのみをキャプチャします。これは基本的に、ビット 16 ~ 23 からバイトを取得しています。

于 2012-08-14T03:05:51.440 に答える