ここでの多くの回答は、現在受け入れられているものを含め、やや後退したと思います。最大のアプリケーションは、バイト/ワード境界を越えてデータをシフトすることです。
- ビットパターンの抽出と挿入
- プロトコル (ビット 6 から始まる 5 ビットを挿入)
- 圧縮方式 (LZW77 など)
- データ転送 (300 ボー モデム誰か? 7 ビット データ + パリティ)
- 任意精度演算
- 2 による乗算/除算はローテーション スルー キャリーを利用します
- 他の 2 のべき乗による乗算/除算には、ROL (または ROR) が必要です。
- 1 ビット グラフィックスの水平スクロール
そしてニッチなアプリケーション:
- crc16/32
- 暗号
- ビットを符号化するため、またはテストのために運ぶための非破壊的な移動ビット
歴史的な観点から、シフトは高価だったということです: 8 ビットのチャンクで 16 ビットを左に 3 シフトする必要がある場合 (または 64 ビットのチャンクで左に 128 ビット)、ROL は 1 つのコストで 2 つの高価なシフトを実行します。
rotate all bits left by 3
hi lo
src = fedcba98|76543210
dst = cba98765|43210---
ビット「765」は 5 だけ右にシフトする必要があり、ビット「43210」は 3 だけ左にシフトする必要があることに注意してください。それらに間違ったビットが付随している場合、これらは安価な操作であるマスキングによって再結合されます。
dst_lo = ((src_lo ROL 3) & 0b11111000)
dst_hi = ((src_lo ROL 3) & 0b00000111) | (src_hi << 3)
これは、bignum シフト、またはモノクロ グラフィックス プレーンを任意のピクセル数だけ水平方向にスクロールすることに拡張されます。
このアルゴリズムは非常に重要であるため、80386 にはそのための double-rotate 命令が含まれています。