4

F# のビット シフト演算子は、値の末尾を超えてビットをシフトするときにローテーションを行わないと記載されています。これは F# Interactive で確認できます。

> a = 128uy としましょう
- <<< 1;;

値 a : バイト = 128uy
値: バイト = 0uy

つまり、上位ビットを 128 の上からずらして 0 にしました。

F# がビットを最後からシフトするのではなくローテートした場合、 MSB位置の 1 ビットがLSBにローテーションされるため、代わりに 1 が得られます。

ただし、2 番目のステートメントを少し変更すると、驚くべき結果が得られます。

> a = 128uy としましょう
- <<< 8;;

値 a : バイト = 128uy
値: バイト = 128uy

これで、バイト内のビットが完全にローテーションされたように見えます!

どうしてこれなの?

4

1 に答える 1

3

ここで起こっていることは、シフトを行う前に、F# がビット シフト演算子の右側の値に対して剰余算術を行っていることです。modF# バイトには 8 ビットあるため、符号なしバイトの場合は8 を使用します。8 mod8 は 0 であるため、バイト内のビットはまったくシフトされません。

値を少しいじると、これがより明確にわかります。

> a = 4uy とする
- <<< 1;;

値 a : バイト = 4uy
値: バイト = 8uy

> <<< 9;;
値: バイト = 8uy
> <<< 17;;
値: バイト = 8uy

8では同等の式であるため、3 つのケースすべてで同じ結果が得られますmod

右シフト ( ) でも同じことが起こり>>>、動作はバイトに限定されません。

于 2013-07-02T22:50:25.917 に答える