2

私はいつビットシフト演算子を使いたい/使うべきかを調べていました。JIT コンパイルがそれを処理するため、2 で乗算するためにそれらを使用する必要がないことを理解しています。java でシフト演算子を使用する必要がある理由に遭遇し、受け入れられた回答の一部に混乱しています。

For example, say I have two bytes that are the high-order and low-order bytes
of a two-byte (16-bit) unsigned value. Say you need to construct that value. 
In Java, that's:

int high = ...;
int low = ...;
int twoByteValue = (high << 8) | low;

You couldn't otherwise do this without a shift operator.

To answer your questions: you use them where you need to use them! and nowhere else.

私には何かが欠けていることはわかっています。なぜなら、彼は高値に 2^8 を掛けて低値に足しているように見えるからです (これまで|このコンテキストで使用されているのを実際に見たことはありませんが、ダミー値を差し込んで実行したとき私のコードでは、2つを一緒に追加しているように見えました)。ここで実際に何が起こっているのですか?

編集:参考までに、私はhigh = 10とを持っていましたlow = 3

4

1 に答える 1

3

例として、数値 54321 の 16 ビット表現を構成してみましょ1101 0100 0011 0001う: 上位 8 ビットと下位 8 ビットから。

上位 8 ビットは次1101 0100 のようになります。 下位 8 ビットは次のようになります。0011 0001

1101 0100 << 8

生産します

1101 0100 0000 0000

|次に、この ( ) を下位ビットに対してビットごとに OR します。

1101 0100 0000 0000
          0011 0001
-------------------
1101 0100 0011 0001

これで、54321 の完全なバイナリ表現が得られました (もちろん unsigned int を使用していると仮定します)。


編集:例を使用するには:high=10およびlow=3

high、8ビットで書き出されると、0000 1010

lowを同じように書くと、0000 0011

ハイを左に 8 ビットシフトすると、次のようになります。

0000 1010 0000 0000

それを low に対して OR すると、次のようになります。

0000 1010 0000 0000
          0000 0011
-------------------
0000 1010 0000 0011

このパターンを 10 進整数として扱うと、2563 を意味します。

おそらく紛らわしいのは、このコンテキストでは10とが3独立してまったく意味を持たないことです。ここで価値があるのは、2つの構成です。

おそらく、ファイルをバイトごとに読み取っていますが、ファイルの一部に 16 ビット整数のシーケンスがあります。16 ビット整数を取得するには、バイトのすべてのペアを取得し、正確にこの方法で結合する必要があります。

ここで、可能な最大整数が 64 ビットであるプラットフォームで、128 ビットを占めるほど大きな整数を格納したい場合を想像してください。これと同様のトリックを使用して、数学をごまかし、その非常に大きな整数を 2 つの別々の値に格納することができます。この例よりも複雑かもしれませんが、このようなビット演算子が必要な理由が理解できると思います。

于 2013-06-21T03:43:17.593 に答える