Soweit ich weiß, ist bei Verwendung eines bitweisen Linksverschiebungsoperators in C garantiert, dass die freien Bits mit Nullen gefüllt werden. Ich habe jedoch gelesen, dass die rechte Verschiebung von der Implementierung abhängig ist, was bedeutet, dass in einigen Maschinen die freien Bits mit 0s aufgefüllt werden, in anderen werden sie mit 1s aufgefüllt.
Ich verwende die rechte Verschiebung in einem Programm, und tatsächlich füllt meine Maschine die freien Bits mit Einsen. Das Problem ist, dass ich es stattdessen mit 0s füllen müsste.
Gibt es eine Möglichkeit, Nullen zu erzwingen, die bei Rechtsverschiebungen verwendet werden?
Eine Lösung wäre, nachdem die Rechtsverschiebung angewendet wurde, eine Maske wie 011111111 zu erstellen und dann ein bitweises UND anzuwenden, wodurch die ganz links eingefügte 1 in eine 0 geändert wird.
Aber das ist umständlich und kostet Zeit. Wenn es eine Möglichkeit gäbe, meiner Maschine zu sagen, dass sie die rechten Schichten mit 1s füllen soll, wäre das viel einfacher.
Vielen Dank
Geben Sie die Nummer ein unsigned
und dann verschieben. Das erzwingt eine 0-Füllung.
Nein, das kannst du nicht.
Verschiebungen bei vorzeichenlosen Typen sind gut definiert (solange der rechte Operand nicht negativ und kleiner als die Breite des linken Operanden ist) und sie werden immer mit Nullen gefüllt.
Verschiebungen (oder bitweise Operationen) bei vorzeichenbehafteten Typen sind im Allgemeinen keine gute Idee. Wenn der linke Operand dann negativ ist <<
hat undefiniertes Verhalten, und >>
liefert ein implementierungsdefiniertes Ergebnis (was bedeutet, dass der Compiler dokumentieren muss, was er tut, aber es gibt keine Möglichkeit für Sie, es zu kontrollieren). Bei nicht negativen Werten eines vorzeichenbehafteten Typs ist das Ergebnis das, was Sie erwarten würden – solange es nicht überläuft (wenn es überläuft, ist das Verhalten undefiniert).
Hier ist, was die C99-Standard sagt (Abschnitt 6.5.7):
Die ganzzahligen Heraufstufungen werden an jedem der Operanden durchgeführt. Der Typ des Ergebnisses ist der des heraufgestuften linken Operanden. Wenn der Wert des rechten Operanden negativ oder größer oder gleich der Breite des heraufgestuften linken Operanden ist, ist das Verhalten nicht definiert.
Das Ergebnis von E1 << E2 ist E1 links verschoben E2 Bitpositionen; frei gewordene Bits werden mit Nullen aufgefüllt. Wenn E1 einen vorzeichenlosen Typ hat, ist der Wert des Ergebnisses E1 × 2E2, reduziert Modulo eins mehr als der im Ergebnistyp darstellbare Maximalwert. Wenn E1 hat einen vorzeichenbehafteten Typ und einen nichtnegativen Wert und E1 × 2E2 im Ergebnistyp darstellbar ist, dann ist das der Ergebniswert; andernfalls ist das Verhalten undefiniert.
Das Ergebnis von E1 >> E2 ist E1 rechts verschoben E2 Bit-Positionen. Wenn E1 hat einen vorzeichenlosen Typ oder wenn E1 einen vorzeichenbehafteten Typ und einen nichtnegativen Wert hat, ist der Wert des Ergebnisses der ganzzahlige Teil des Quotienten von E1 / 2E2. Wenn E1 einen vorzeichenbehafteten Typ und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert.
Es gibt zwei verschiedene Rechtsverschiebungsoperationen: arithmetisch und logisch.
Die logische Verschiebung wird bei vorzeichenlosen Zahlen in C verwendet. Sie füllt die hohen Bits immer mit Nullen auf. Das brauchen Sie.
Die arithmetische Verschiebung wird bei vorzeichenbehafteten Zahlen verwendet, da sie das Vorzeichen der zu verschiebenden Zahl beibehält. Wenn die Zahl positiv ist, ist das höchstwertige Bit 0 und wird mit Nullen gefüllt. Wenn die Zahl negativ ist, ist das höchstwertige Bit 1, also wird es mit 1s gefüllt.
Beachten Sie, dass diese in Java tatsächlich andere Operatoren verwenden: >>
für Rechnen, >>>
für logisch. Dies ist erforderlich, da Java keinen unsignierten Typ hat.
13836100cookie-checkKönnen Sie steuern, was eine bitweise Rechtsverschiebung in C ausfüllt?yes
Welche Plattform / Betriebssystem / Compiler verwenden Sie?
– Stefan Groß
7. Dezember 2011 um 20:26 Uhr
@Stephen Gross, GCC auf Ubuntu 11.10.
– Daniel Scocco
7. Dezember 2011 um 20:29 Uhr
Siehe auch Zeichen, das sich von einer konstanten Bitbreite aus erstreckt
– jww
12. Dezember 2018 um 12:18 Uhr