重複の可能性:
ビット演算の実用的なアプリケーション
プログラミングを始めて数年になりますが、ビット単位の演算子の実用的なアプリケーションについていつも疑問に思っていました。
私のプログラミング経験では、ビットごとの演算子を使用する必要はありませんでした。それらはいつ最も一般的に使用されますか? 私のプログラミングのキャリアにおいて、これらを学ぶ必要はありますか? ありがとうございました。友好的に、ジェームズ
重複の可能性:
ビット演算の実用的なアプリケーション
プログラミングを始めて数年になりますが、ビット単位の演算子の実用的なアプリケーションについていつも疑問に思っていました。
私のプログラミング経験では、ビットごとの演算子を使用する必要はありませんでした。それらはいつ最も一般的に使用されますか? 私のプログラミングのキャリアにおいて、これらを学ぶ必要はありますか? ありがとうございました。友好的に、ジェームズ
最近は必要ありませんが、pascal をコーディングするときに、除数または乗算が 2 のべき乗である場合はいつでも、乗算または除算に使用していました。
色はバイトに格納され、下位 4 ビットに textcolor 、上位 4 ビットに背景色が格納されていました。
c * 16 の場合は代わりに c << 4 を使用し、c / 16 の代わりに c >> 4 を使用してバックグラウンドを保存または取得すると、何倍も高速でした。
また、 c <<4 >> 4 での textcolor の取得も c & 15 (bitvize and) よりもなぜか高速でした。おそらく登録関連;)しかし、それは私の頭を超えています:D
ただし、チェックサムの計算、圧縮、または暗号化を行っていない限り、おそらくなくてもかまいません。
ビットを int に何度も格納できる場合でも、ドライバーは任意の方法で物事を最適化でき、c# ではフラグ列挙型を使用して、ビット フラグをバイト、ワード、または整数値に自動的にパックできます。
ですから、用途が見つからないので、おそらくそれらが意味のある分野で仕事をしていないと思います.
データのパック、圧縮の実行、または複数のブール値を 1 バイトにパックするときに、ビット単位の操作がハードウェアの近くで頻繁に使用されます。ビット演算はプロセッサ命令に直接マップされ、多くの場合非常に高速です。
I/O またはデバイス インターフェイスを使用している場合、ビットフィールドの一部を重要なデータに分離するために、ビット単位の操作が非常に必要になります。
または、2 倍の高速乗算として使用することもできます。:)
バイナリとビットいじりのもう 1 つの楽しい使用法。
モールス信号を 1 バイトに詰め込みます。A.
は0
、a-
は 1 です。
A = .-
A = 00000001xB
// Add a 'start bit'
A = 00000101xB
ビットを 8 回ほどずらし、開始ビットを見つけたら音を鳴らします。
+------- Monitor this position
V
A = 00000101 // Starting off
A = 00001010 // Nothing yet
A = 00010100 // Still nothing
A = 00101000 // WOw, a lot of nothing
A = 01010000 // Our boring life, we do nothing
A = 10100000 // Wow! A start bit! Prep to play sound.
A = 01000000 // Play a short
A = 10000000 // And play a long.