2011-12-08 10 views
2

"ビットシフト"の意味は不思議でした。現在、BufferedImageを使用してJavaでイメージフィルタを作成しようとしています。他の投稿のRGB値に個別にアクセスする方法についていくつかの良い答えを見つけましたが、どのように動作するかは正確にはわかりませんでした。私はRGB値が値を表す各8ビット部分の32ビットintに格納されていることを理解しています。これは私が見ていたものですJavaでのaRGB値のビットシフトの説明

:基本的にはこのプロセスを説明するために誰かを探してa link

は、グーグルが行わアイブ氏があまりにも技術的でした検索します。

+1

[ビットシフトへの完全な初心者ガイド](http://stackoverflow.com/questions/141525/absolute-beginners-guide-to-bit-shifting)と[その他多くの](http://検索q =何+ +ビット+シフト&提出=検索) –

+1

本当に。私は彼が一般的にビットシフトではなく表現を理解しようとしていると思う。 –

答えて

2

複数の情報を含む単一の整数を持つ場合、マスキングとシフトは個々の部分にアクセスするために使用されるプロセスです。

aRGB: 255, 65, 33, 17 
binary: 11111111 01000001 00100001 00010001 

は、変数xから赤の値(65)を取得するには、次のバイトと仮定すると、これはあなたがそれらを取得するために何ができるかである(彼らはおそらく...ではありませんが、)などのように格納されています。

そして
x && 0x00FF0000 

    11111111 01000001 00100001 00010001 
* 00000000 11111111 00000000 00000000 
------------------------------------- 
    00000000 01000001 00000000 00000000 

シフト動作、孤立値として、彼らが意味をなす場合にビットを移動するには:バイナリマスクは他のすべてを設定することによって、値だけ第二のバイトを取り込む

00000000 01000001 00000000 00000000 >> 16 = 00000000 00000000 00000000 01000001 

ビットを0にする。 2番目のバイトと一致するビットだけがそのまま残ります(0ではなく1が掛けられます)。次に、ビットを右の16桁にシフトして、余分な0を取り除きます。明らかに、先頭の0は重要ではないので、結果は単純なバイナリの01000001つまり小数点65にすぎません。

+0

私の答えは、結合された値からバイトを取得することです。 @Angeloは反対の答え、個々の部分から組み合わされた価値を構築する方法。リンクを再読み、私はアンジェロの答えが疑問にふさわしいと思う。 –

+0

あなたの説明をありがとう、本当に今意味があります。 – 0xOffset

0

ビット単位演算は、整数または浮動小数点数として表されるデータではなく、データのバイナリ表現のビットに対する演算です。例えば、8はバイナリで1000として表されてもよい。右に2回移動すると、すべての桁が3だけ右に移動し、0が埋められて0010または2になります。

詳細については、Wikipedia articleを参照してください。

2

本質的に技術的です。あなたが値0保存 - 255、またはバイナリで:

from 
00000000 
to 
11111111 

を、あなたはこのような大きなコンテナ取る:

0000000000000000 

をし、あなたの色は117

0000000001110101 
であるかのように、そこにそれを挿入します

とあなたが得るように、左の1バイトに、それをシフト

0111010100000000 

あなたは第二の色を追加し、言うことは、65または01000001と

0111010101000001 

その後は再び左にそれを1つのバイトをシフトして、第三の色を追加し、最後に

011101010100000100000000 

をゲットし、ビットシフトを経由して255 - あなたは

011101010100000111111111 

を取得し、その例えば255または11111111ますので、3つの値0を格納しています。

0

メモリ内のビットのパターンについて考える方法は複数あります。通常、整数に格納されたビットは1つの数値を表すものと考える。上位ビットを下位ビットよりも大きい値に寄与し、それらの値は、単一の数に到達するために加算されるので、以下のパターン:

00001101 00110000 00000111 

に解釈されるように:

2^0 + 2^1 + 2^3 + 2^13 + 2^14 + 2^15 + 2^17 + 2^18 = 864,263 

しかし、このパターンは3つのという8ビットの数字の個別のグループ(それぞれが色成分の数値を表す)として考えることが自由です。しかし、上位ビットのビットパターンを表現しようとする数に変換するには、それらのビットを右端の8ビットグループにあるように解釈する必要があります。これが私たちがシフトする理由です。

たとえば、左端の8ビットグループの値を取得するには、そのグループに含まれていないすべてのビットをマスクし、次にそれらのビットを右に16桁移動して右端の位置に配置する必要があります。

// first, assume n = 00001101 00110000 00000111 
(n & 0xFF0000) >> 16 // red 

ゼロは自動的に残して、空いたビットにシフトさ:

私たちが今のように解釈できる
00000000 00000000 00001101 

13 
値これらの成分の一つの他の方向にシフトする必要が設​​定

(n & 0x00FF00) >> 8 // green 
n & 0x0000FF // blue (no shift necessary) 

:0

同様に、我々は、中央のビットと右端のグループの値を算出することができます。例えば、中央の8ビット位置に次のシフト75

n = (n & (0xFF00FF)) | (75 << 8) 

我々は最初(0xFF00FFマスクを有する)緑色値をリセットした後、左に数75 8ビットシフトしています。最後に、これら2つの数値を組み合わせます。

私たちは、これが再び出て、それをシフトさせることにより動作することを確認できます。

(n & 0x00FF00) >> 8 // => 75 

コンポーネントの 1をリセットまたは最大化がさらに簡単です。

n = n & 0xFF00FF // clear out green 

以下マスクが、一方、緑色成分の値を最大化:我々は、以前の例で見てきたように、ゼロINGの成分は次のように行うことができ

n = n | 0x00FF00