web-dev-qa-db-ja.com

ルストのシフト演算子の正確なセマンティクスは何ですか?

<<演算子と>>演算子が整数でどのように機能するかについて正確な情報を見つけようとしましたが、明確な答えが見つかりませんでした( ドキュメント はその点ではそれほど優れていませんに関して)。

私にははっきりしないセマンティクスの2つの部分があります。最初に、どのビットが「シフトイン」されますか?

  • ゼロは片側からシフトインされます(つまり、0b1110_1010u8 << 4 == 0b1010_0000u8)、または
  • ビットが回転する(つまり、0b1110_1010u8 << 4 == 0b1010_1110u8)、または
  • 指定されていない(整数のオーバーフロー動作が指定されていないなど)、または
  • 他の何か。

さらに、シフトは符号付き整数でどのように機能しますか?符号ビットもシフトに含まれるかどうか。それとも不特定ですか?

16

ルストのシフト演算子の正確なセマンティクスは何ですか?

ありません。シフト演算子はユーザーが実装可能な特性であり、基本的にはそれらの中で何でもやりたいことができます。ドキュメントには、「指定された量だけベクトルを右にスピンするShrの[a] n実装」の例も示されています。


<<および>>演算子は整数に対して機能し、

リファレンスには、セクション 算術および論理2項演算子 に関するセクションがあります。最も便利なのは、この脚注が含まれていることです。

符号付き整数型の算術右シフト、符号なし整数型の論理右シフト。

論理シフト および 算術シフト は、確立された定義を持つ既存のコンピュータサイエンス用語です。

ゼロがシフトされます

はい。

ビットが回転します

いいえ。 の回転には、個別の方法があります。

12
Shepmaster

トレイトShlShrに関する薄いドキュメントは意図的なものであり、手元の型に最も適した動作を採用することができます(newtypesと考えてください!)。

そうは言っても、基本の整数型に関しては、 Rust参照 はそれらがどのように動作するかを、少し推論しながらカバーしています:

  • << |左シフト| std::ops::Shl

  • >> |右シフト* | std::ops::Shr

*符号付き整数型の算術右シフト、符号なし整数型の論理右シフト。

また、いくつかの例も含まれています。これらは従来の論理/算術シフトであることをさらに明確にします。ゼロは左ビットシフトの最下位ビットに挿入され、最上位ビットは右ビットシフトの符号付き整数に拡張されます。メソッドrotate_leftおよびrotate_rightで説明されているように、これも ローテーションではありません です。

assert_eq!(13 << 3, 104);
assert_eq!(-10 >> 2, -3);

さらに、多すぎるビットをシフトすると、算術オーバーフローと見なされる可能性があり、未定義の動作ではありません。参照: ビットシフトが大きすぎると、Rustで未定義の動作になると予想されますか?