2010-02-25 2 views
7

Hey, ich bin selbstlernend über bitweise, und ich sah irgendwo im Internet, dass arithmetische Verschiebung (>>) um eine halbe Nummer. Ich wollte es testen:Warum arithmetische Verschiebung die Hälfte nur eine Zahl in einigen Vorfällen?

44 >> 1 returns 22, ok 
22 >> 1 returns 11, ok 
11 >> 1 returns 5, and not 5.5, why? 

Ein anderes Beispiel:

255 >> 1 returns 127 
127 >> 1 returns 63 and not 63.5, why? 

Dank.

+1

Splitting Bits sind nicht erlaubt. Es tut uns leid. – leppie

+0

@leppie: huh ??? –

Antwort

13

Der Bit-Shift-Operator wird nicht tatsächlich durch 2 geteilt. Stattdessen werden die Bits der Zahl um die auf der rechten Seite angegebene Anzahl nach rechts verschoben. Zum Beispiel:

00101100 = 44 
00010110 = 44 >> 1 = 22 

bemerken, wie die Bits in der zweiten Zeile sind die gleiche wie die Zeile darüber, lediglich verschoben um eine Stelle nach rechts. Sehen Sie sich das zweite Beispiel an:

00001011 = 11 
00000101 = 11 >> 1 = 5 

Dies ist genau der gleiche Vorgang wie zuvor. Das Ergebnis von 5 ist jedoch aufgrund der Tatsache, dass das letzte Bit nach rechts verschoben ist und verschwindet, wodurch das Ergebnis 5 erzeugt wird. Aufgrund dieses Verhaltens wird der Rechtsverschiebungsoperator im Allgemeinen äquivalent zum Dividieren durch zwei sein und dann wegwerfen irgendein Rest oder Dezimalanteil.

+0

Im ersten Satz, ich denke, Sie wollten nach rechts sagen. – Joel

+0

@Joel: Du hast Recht. Fest. –

+0

Nun, die Operation ist genau das gleiche wie Integer Division oder Multiplikation mit 2^n. – Tronic

1

Binär hat kein Konzept von Dezimalzahlen. Es gibt den abgeschnittenen (int) Wert zurück.

11 = 1011 binär. Verschieben Sie nach rechts und Sie haben 101, was 5 in Dezimal ist.

+0

Es ist durchaus möglich, Ziffern nach dem "Dezimal" -Punkt im Binärformat zu haben. 101.1 macht vollkommen Sinn, die Ziffer nach dem Punkt repräsentiert einfach 2^-1 in der gleichen Weise wie in Dezimal es 10^-1 darstellt. Das Problem ist, dass der Datentyp Daten auf diese Weise nicht speichert, daher wird der Wert in einer Bit-Shift-Operation abgeschnitten. – JonC

2

11 in binär 1011

11 >> 1 

bedeutet, dass Sie Ihre binäre Darstellung nach rechts um einen Schritt zu verschieben.

1011 >> 1 = 101 

Dann haben Sie 101 in binärer die 1 * 1 + 0 * 2 + 1 * 4 = 5.
Wenn Sie getan hatte 11 >> 2 würden Sie als Ergebnis 10 binär dh haben 2 (1 * 2 + 0 * 1).

Die Verschiebung um 1 nach rechts wandelt die Summe (A_i * 2^i) [i = 0..n] in Summe um (A_ (i + 1) * 2^i) [i = 0..n-1 ] Deshalb, wenn Ihre Zahl gerade ist (dh A_0 = 0), wird sie durch zwei geteilt. (Entschuldigung für die angepasste LateX-Syntax ... :))

0

Bitverschiebung ist die gleiche wie Division oder Multiplikation mit 2^n. Bei Integer-Arithmetik wird das Ergebnis auf Null zu einer ganzen Zahl gerundet. Bei Gleitpunktarithmetik ist Bitverschiebung nicht erlaubt.

Intern Bit-Shifting, gut, verschiebt Bits, und die Rundung bedeutet einfach Bits, die von einer Kante fallen einfach entfernt werden (nicht, dass es tatsächlich den genauen Wert berechnen würde und dann runden). Die neuen Bits, die auf der gegenüberliegenden Seite erscheinen, sind immer Nullen für die rechte Seite und für positive Werte. Bei negativen Werten werden auf der linken Seite 1 Bit angehängt, so dass der Wert negativ bleibt (siehe two's complement) und die arithmetische Definition, die ich verwendet habe, immer noch gültig ist.

0

In den meisten statisch typisierten Sprachen ist der Rückgabetyp der Operation z. "int". Dies schließt ein Bruchergebnis aus, ähnlich wie bei einer Ganzzahl-Division.

(Es gibt bessere Antworten über das, was ‚unter der Haube‘, aber Sie brauchen nicht diejenigen grok die Grundlagen des Typsystems. Zu verstehen)

Verwandte Themen