2

コードで以下の行に出くわしました

unsigned char A = 0xB9; 
unsigned char B = 0x91; 
unsigned char C = A << 3; // shift bits in A three bits to the left. 
unsigned char D = B >> 2; // shift bits in B two bits to the right.

ビットシフトであることは知っていますが、それがどのような目的に役立ち、いつ使用する必要があるのか​​ わかりません。

4

6 に答える 6

19

主な用途は、特定のビットに関して定義されたより大きなアイテムの一部がある場合です。

わかりやすい例として、色を保持する 32 ビットの数値を考えてみましょう。赤、緑、青にそれぞれ 8 ビット、(おそらく) アルファ (この色/ピクセルの透明度を示す) に残りの 8 ビットを使用します。16 進数では、数字は次のようになります。

AARRGGBB

(つまり、各コンポーネントの 2 桁または 8 ビット)。

そのようなものを取り、次のようなコンポーネントに分割できます。

red = color & 0xff;
green = (color >> 8) & 0xff;
blue = (color >> 16> & 0xff;
alpha = (color >> 24) & 0xff;

逆に、コンポーネントをまとめることができます:

color = (alpha << 24) | (blue << 16) | (green << 8) | red;

また、ハードウェアを扱うときは、通常、このようなビット操作を行うことになります。たとえば、あるものに 5 ビット、別のものにさらに 2 ビット、3 番目のものに 6 ビットなどを割り当てる 16 ビット レジスタがあるとします。これらのいずれかを変更する場合は、上記の色の例のように行います。1 つのフィールドを表すビットを分離し、必要に応じて変更してから、他のビットと一緒に戻します。

もう 1 つの (まったく関係のない) アプリケーションは、ハッシュのようなものです。ここでは通常、そのようなフィールドはありませんが、入力のバイトによって少なくともある程度影響を受ける出力のすべてのビットで、入力のいくつかのバイトが単一の出力を生成するようにします。それを達成するために、ほとんどの場合、入力の各バイトが結果のさまざまな部分に影響を与える可能性が少なくともあるように、ビットをシフトすることになります。

古いコードのかなりの部分がビット シフトを使用して 2 の累乗で乗算または除算を最適化していますが、これは通常、最新のハードウェアとコンパイラでは時間の無駄です。既存のコードでそれを確認し、それが何を達成しようとしているのかを理解する必要がありますが、その例をエミュレートしようとしないでください。

于 2012-06-17T15:03:19.143 に答える
10

例として、ピクセルがそれぞれ 1 ビットで表される (モノクロ) ビットマップがあります。
円があるとします

........
...oo...
..O..O..
.O....O.
.O....O.
..O..O..
...oo...
........

ここで、a.は 0 ビットで、aOは 1 ビットで表されるため、2 行目は 2 進数の 00011000、つまり 10 進数の 24 で表されます。円を 1 ピクセル右に移動する場合は、ビットをシフトします。その表現では、右に 1 ビット。

........
....oo..
...O..O.
..O....O
..O....O
...O..O.
....oo..
........

したがって、2 行目はシフト後 00001100 (または 10 進数の 12) になります。

それは少し明確になりますか?

于 2012-06-17T15:00:29.697 に答える
5

ビットシフトにはいくつかの目的があります

  • 2 の累乗による乗算または除算
  • 最上位ビットまたは最下位ビットが設定されているかどうか (MSB または LSB) をチェックすることは、オーバーフローまたはアンダーフローを探すことによって設定されます。
  • 弱い形式の暗号化
于 2012-06-17T14:55:08.927 に答える
0

1 つの使用法は、整数の 2 乗による除算または乗算です。

于 2012-06-17T14:53:57.577 に答える
0

ファイルの圧縮には、ビットシフトまたはビットパターンが使用されます。暗号化に使用するものもあります。

于 2012-06-17T14:54:22.283 に答える
0

シフトの使い道はたくさんあります。ここで現実的に説明できる以上のものがあります。良い例は、コードを組み立てるときに値を正しい位置にシフトすることです。また、1 の左シフトは値を 2 で乗算するのと同じですが、はるかに高速です。同様に、右シフトは 2 で除算することと同じです。

于 2012-06-17T14:55:22.943 に答える