14

Scalaの >> と >>> 演算子に違いはありますか?

scala> 0x7f >>> 1
res10: Int = 63

scala> 0x7f >> 1 
res11: Int = 63

scala> 0x7f >> 4
res12: Int = 7

scala> 0x7f >>> 4
res13: Int = 7
4

3 に答える 3

25

演算子は>>符号を保持し (符号拡張)、>>>左端のビットをゼロにします (ゼロ拡張)。

-10>>2
res0: Int = -3
-10>>>2
res1: Int = 1073741821

自分で試してみてください。

これは、Java とは異なり、符号付きと符号なしの型を持つ C のような言語では必要ありません>>>(符号なしの整数がないため)。

于 2013-06-20T04:46:10.063 に答える
4

Java と同じ意味です。

Java™ チュートリアル - Bitwise and Bit Shift Operatorsから:

符号付き左シフト演算子 "<<" はビット パターンを左にシフトし、符号付き右シフト演算子 ">>" はビット パターンを右にシフトします。ビット パターンは左側のオペランドで指定され、シフトする位置の数は右側のオペランドで指定されます。符号なし右シフト演算子 ">>>" はゼロを左端の位置にシフトしますが、">>" の後の左端の位置は符号拡張に依存します。


>>>Java にのみ存在し、C または C++ には存在しません。

于 2013-06-20T04:46:18.783 に答える
2

注: SLIP 30 (2015 年 11 月) では、Scala は (2016 年? 2017 年?) 符号なし整数を表す 4 つの「プリミティブ」型UByte( 、UShortUIntおよび) になる可能性がありULongます。

これは、 UInts および ULongs のビット シフト操作に>>影響を与えます。これは、との違いも示しています>>>

<<にシフトし、論理的に右にシフト>>>すると、当然のように動作します。

算術右シフトのケース>>は議論の余地があります。
次の 2 つの理由から、符号なし整数では使用できないと主張します。

  • まず、シフト算術権は、符号なし整数に対しては何の意味もないようです。正しい算術シフト if >>>. したがって、 と同様にunary_-導入しないでください。
  • 第 2 に、C ファミリなどの符号なし整数型を持つ既存の言語は、>>符号付きオペランドか符号なしオペランドかによって、実際には異なるセマンティクスを に与えます。符号なしオペランド
    A>>は符号拡張しません。Scala で符号拡張することは C 開発者を混乱させるでしょうがx >> 3、符号拡張しない Scala 開発者を同様に混乱させるでしょうx >> 3。したがって、完全に省略して、コンパイラ エラーが発生するようにすることをお勧めします。

ビットいじりベースのアルゴリズムで符号拡張右シフトが必要な場合は、符号付きとして再解釈し、操作を実行して、符号なしとして再解釈することが常に可能です: (x.toInt >> 3).toUInt.

注: 現在の実装では>>、この点に同意するまでは が提供されます。

于 2016-03-09T07:06:16.887 に答える