2017-06-22 1 views
-2

Ich habe die klassische Hacker Freude gelesen und ich habe Schwierigkeiten zu verstehen, den Unterschied zwischen logischer Verschiebung rechts, arithmetische Verschiebung rechts und rechts drehen. Bitte entschuldigen Sie, wenn der Zweifel zu einfach erscheint.Bitte erklären Sie den Unterschied zwischen logischer Verschiebung rechts, arithmetische Verschiebung rechts und rechts rotieren

Also why is there no arithmatic shift left?

+0

Was hat das mit C zu tun? –

+1

Was ist los mit den Wikipedia-Artikeln? Was verstehst du nicht über sie? – Lundin

+0

Ich habe den Unterschied zwischen der arithmetischen und logischen Verschiebung nicht verstanden. –

Antwort

3

Denken Sie zunächst daran, dass Maschinenwörter eine feste Größe haben. Sprich 4, und dass Ihre Eingabe ist:

+---+---+---+---+ 
| a | b | c | d | 
+---+---+---+---+ 

Dann ist alles um eine Position nach links schieben gibt:

+---+---+---+---+ 
| b | c | d | X | 
+---+---+---+---+ 

Frage, was als X setzen?

  1. mit einem Verschiebung 0 setzen
  2. mit drehena setzen

Jetzt ist alles um eine Position nach rechts schieben gibt:

+---+---+---+---+ 
| X | a | b | c | 
+---+---+---+---+ 

Frage, was als setzen X?

  1. mit einer Verschiebung 0 gesetzt
  2. mit einer Stellenverschiebung setzen a
  3. mit drehend setzen

Grob.

Shift entspricht (linkshift) Multiplikation mit 2, (right-shift) ganzzahlige Division mit 2.

Arithmetische Verschiebung ist etwas in Bezug auf 2'-Komplement-Darstellung von vorzeichenbehafteten Zahlen. In dieser Darstellung ist das Vorzeichen das äußerste linke Bit, und die arithmetische Verschiebung bewahrt das Vorzeichen (dies wird Vorzeichenerweiterung genannt).

Drehen hat keine gewöhnliche mathematische Bedeutung und ist fast eine veraltete Operation sogar in Computern.

2

Der Unterschied ziemlich in der rechten Spalte erläutert.

  • Logische Verschiebung behandelt die Zahl als ein Bündel von Bits und Verschiebungen in Nullen. Dies ist der -Operator in C.
  • Arithmetische Verschiebung behandelt die Zahl als eine Ganzzahl mit Vorzeichen (in 2s Komplement) und "behält" das oberste Bit bei Nullen, wenn das oberste Bit 0 war, und Einsen, wenn es war ein. Der Rechtsverschiebungsoperator von C hat ein implementierungsdefiniertes Verhalten, wenn die verschobene Zahl negativ ist.

    Zum Beispiel wird die Binärzahl 11100101 (-27 in Dezimal, angenommen 2s Komplement), wenn nach rechts geschoben 3 Bits mit logischer Verschiebung, 00011100 (Dezimal 28). Dies ist eindeutig verwirrend. Unter Verwendung einer arithmetischen Verschiebung würde das Vorzeichen-Bit beibehalten werden, und das Ergebnis würde 11111100 (Dezimal -4, was ungefähr gleich für -27/8 ist).

  • Drehung tut auch nicht, da oberste Bits durch unterste Bits ersetzt werden. C hat keinen Operator, um eine Rotation durchzuführen.

+0

Können Sie die arithmetische Verschiebung etwas deutlicher erklären? Und Beispiel bitte? –

+0

@ChandrahasAroori gibt es Tonnen von Beispielen, die Sie auf Google https://en.wikipedia.org/wiki/Bitwise_operation finden können –

Verwandte Themen