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
演算子は>>
符号を保持し (符号拡張)、>>>
左端のビットをゼロにします (ゼロ拡張)。
-10>>2
res0: Int = -3
-10>>>2
res1: Int = 1073741821
これは、Java とは異なり、符号付きと符号なしの型を持つ C のような言語では必要ありません>>>
(符号なしの整数がないため)。
Java と同じ意味です。
Java™ チュートリアル - Bitwise and Bit Shift Operatorsから:
符号付き左シフト演算子 "<<" はビット パターンを左にシフトし、符号付き右シフト演算子 ">>" はビット パターンを右にシフトします。ビット パターンは左側のオペランドで指定され、シフトする位置の数は右側のオペランドで指定されます。符号なし右シフト演算子 ">>>" はゼロを左端の位置にシフトしますが、">>" の後の左端の位置は符号拡張に依存します。
>>>
Java にのみ存在し、C または C++ には存在しません。
注: SLIP 30 (2015 年 11 月) では、Scala は (2016 年? 2017 年?) 符号なし整数を表す 4 つの「プリミティブ」型UByte
( 、UShort
、UInt
および) になる可能性がありULong
ます。
これは、 UInts および ULongs のビット シフト操作に>>
影響を与えます。これは、との違いも示しています>>>
。
左
<<
にシフトし、論理的に右にシフト>>>
すると、当然のように動作します。算術右シフトのケース
>>
は議論の余地があります。
次の 2 つの理由から、符号なし整数では使用できないと主張します。
- まず、シフト算術権は、符号なし整数に対しては何の意味もないようです。正しい算術シフト if
>>>
. したがって、 と同様にunary_-
導入しないでください。- 第 2 に、C ファミリなどの符号なし整数型を持つ既存の言語は、
>>
符号付きオペランドか符号なしオペランドかによって、実際には異なるセマンティクスを に与えます。符号なしオペランドの
A>>
は符号拡張しません。Scala で符号拡張することは C 開発者を混乱させるでしょうがx >> 3
、符号拡張しない Scala 開発者を同様に混乱させるでしょうx >> 3
。したがって、完全に省略して、コンパイラ エラーが発生するようにすることをお勧めします。ビットいじりベースのアルゴリズムで符号拡張右シフトが必要な場合は、符号付きとして再解釈し、操作を実行して、符号なしとして再解釈することが常に可能です:
(x.toInt >> 3).toUInt
.注: 現在の実装では
>>
、この点に同意するまでは が提供されます。