Unterschied zwischen und in Scala

8

Gibt es einen Unterschied zwischen & gt; & gt; und & gt; & gt; & gt; Bediener in Scala?

%Vor%     
Kokizzu 20.06.2013, 04:42
quelle

3 Antworten

16

Der Operator >> behält das Vorzeichen (Vorzeichenerweiterungen) bei, während >>> die Bits ganz links (Nullenerweiterungen) auf Null setzt.

%Vor%

Probieren Sie es selbst aus.

Dies ist nicht notwendig in Sprachen wie C, die signierte und unsignierte Typen haben, im Gegensatz zu Java, das auch >>> hat (weil es keine Ganzzahlen ohne Vorzeichen hat).

    
Jonathon Reinhart 20.06.2013, 04:46
quelle
2

Hinweis: Mit SLIP 30 (Nov. 2015) könnte Scala enden (in 2016? 2017? ) mit 4 "primitiven" Typen, die vorzeichenlose Ganzzahlen darstellen: UByte , UShort , UInt und ULong .

Das würde Bitverschiebungsoperationen für UInts und ULongs , die auch den Unterschied zwischen >> und >>> :

veranschaulichen
  

Shift links << und Verschiebung logisch rechts >>> verhalten sich in der offensichtlichen Weise.

     

Der Fall der Verschiebungsarithmetik rechts >> ist umstritten.
  Wir argumentieren, dass es für unsigned Ganzzahlen aus zwei Gründen nicht verfügbar sein sollte:

     
  • Zunächst scheint ein shift-arithmetisches Recht keine Bedeutung für unsigned Ganzzahlen zu haben. Die korrekte arithmetische Verschiebung wenn >>> . Daher sollte es ähnlich wie unary_- nicht eingeführt werden.
  •   
  • Zweitens geben vorhandene Sprachen, die unsigned Integer-Typen wie die C-Familie haben, >> unterschiedliche Semantiken, je nachdem, ob sie einen signierten oder unsignierten Operanden haben :
      A >> auf einem vorzeichenlosen Operanden wird nicht vorzeichenerweitert. Es wäre für einen C-Entwickler verwirrend, wenn x >> 3 in Scala signieren würde, aber es würde für einen Scala-Entwickler ebenso verwirrend sein, dass x >> 3 nicht sign-extend ist. Daher ziehen wir es vor, es komplett wegzulassen und einen Compiler-Fehler auszulösen.
  •   

Wenn ein Bit-Twiddling-basierter Algorithmus das vorzeichenerweiternde Shift-Recht benötigt, ist es immer möglich, ihn als signiert neu zu interpretieren, die Operation auszuführen und als unsigned neu zu interpretieren: (x.toInt >> 3).toUInt .

     

Hinweis: Die aktuelle Implementierung liefert >> , bis wir uns in diesem Punkt einig sind.

    
VonC 09.03.2016 07:06
quelle
1

Sie haben dieselbe Bedeutung wie in Java. Der unterschriebene Linksverschiebungsoperator "& lt; & lt;" verschiebt ein Bitmuster nach links, und der vorzeichenbehaftete Rechtsverschiebungsoperator "& gt; & gt;" verschiebt ein Bitmuster nach rechts. Das Bitmuster wird durch den linken Operanden und die Anzahl der zu verschiebenden Positionen durch den rechten Operanden angegeben. Der vorzeichenlose Rechtsverschiebungsoperator "& gt; & gt; & gt;" Verschiebt eine Null in die äußerste linke Position, während die äußerste linke Position nach "& gt; & gt;" hängt von der Zeichenerweiterung ab.

    
4lex1v 20.06.2013 04:46
quelle

Tags und Links