F# のビット シフト演算子は、値の末尾を超えてビットをシフトするときにローテーションを行わないと記載されています。これは F# Interactive で確認できます。
> a = 128uy としましょう - <<< 1;; 値 a : バイト = 128uy 値: バイト = 0uy
つまり、上位ビットを 128 の上からずらして 0 にしました。
F# がビットを最後からシフトするのではなくローテートした場合、 MSB位置の 1 ビットがLSBにローテーションされるため、代わりに 1 が得られます。
ただし、2 番目のステートメントを少し変更すると、驚くべき結果が得られます。
> a = 128uy としましょう - <<< 8;; 値 a : バイト = 128uy 値: バイト = 128uy
これで、バイト内のビットが完全にローテーションされたように見えます!
どうしてこれなの?