Bitverschiebung negative Zahl

02/03/2014 13:19 Belur#1
Hey,

habe eine Frage zur Bitverschiebung.

Wenn ich beispielsweise einen 8Bit Wert habe:

0000 1010, also die dezimale 10, und den Bitweise verschieben möchte, beispielsweise: 10 << 2;
Dann "schiebe" ich ja eigentlich zwei Nullen von rechts rein, was in einer
0010 1000, also 40 resultieren würde.

Wie läuft das mit negativen Zahlen? Wenn die im Zweierkomplement vorliegen, muss ich dann Einsen anstatt Nullen "reinschieben" ?

Die Dokumentation sagt nur:

Quote:
5 The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2E2. If E1 has a signed type and a negative value, the
resulting value is implementation-defined.
Was für mich keine klare Aussage ist.

Grüße
02/03/2014 14:39 Padmak#2
Deine Frage bezieht sich auf left-shifting, der Doku-Auszug aber auf right-shifting.
Was von beidem willst du nun wissen? Ich geh jez einfach mal von rechts aus.

Grundsätzlich ist shifting für negative Zahlen *eher* ungeeignet, eben genau wegen dieser Problematik.
Du kannst natürlich immer einfach das höchste Bit auf 1 setzen, wenn die vorherige Zahl negativ war.
Ich hab das ganze jetzt mal mit GCC getestet, bei 'ner negativen Zahl schiebt er von rechts auch lauter 1er rein.
Du kannst natürlich zur Sicherheit alles links der originalen Bits mit 1ern füllen, dann bleibts negativ

Padmak
02/03/2014 16:13 MrSm!th#3
Bitshifting ist für Zahlenoperationen auf binärer Ebene gedacht, da gibt es kein negativ. Mir fallen nur wenige Use-Cases ein, bei denen einen das Vorzeichen einer solchen Zahl interessieren würde.

Soweit ich weiß, ist das plattformabhängig, ob mit 1en, 0en oder dem letzten Bit an der jeweiligen Seite aufgefüllt wird.

Wenn ich mich recht erinnere, wird bei Intel von links mit dem Vorzeichenbit und von rechts mit 0 (oder war es mit dem Carryflag?) aufgefüllt.