Forum: Mikrocontroller und Digitale Elektronik rechts schiften -> obere zwei Bits werden mit 1 gefüllt


von Chris (Gast)


Lesenswert?

Hallo,

ich schifte eine Variable mit Typ Integer zwei mal nach rechts (>>2). 
Ich möchte nämlich durch 4 dividieren.

Das Problem ist, dass die oberen zwei Bits mit 1 gefüllt werden 
(entspricht dann nicht einer Division durch 4). Wie stelle ich das am 
einfachsten an, dass diese mit 0 gefüllt werden?

Vielen Dank für eure Hilfe!

von Dominik S. (dasd)


Lesenswert?

Deine Variable muss vor den SHiften unsigned sein.

von Norbert (Gast)


Lesenswert?

Chris schrieb:
> Hallo,
>
> ich schifte eine Variable
ist das so ähnlich wie: ich downloadete eine Datei?

> mit Typ Integer zwei mal nach rechts (>>2).
> Ich möchte nämlich durch 4 dividieren.
>
> Das Problem ist, dass die oberen zwei Bits mit 1 gefüllt werden
> (entspricht dann nicht einer Division durch 4). Wie stelle ich das am
> einfachsten an, dass diese mit 0 gefüllt werden?

'Signed' - 'Unsigned' als Stichwörter zur Suche

von Falk B. (falk)


Lesenswert?

@Chris (Gast)

>ich schifte eine Variable mit Typ Integer zwei mal nach rechts (>>2).
>Ich möchte nämlich durch 4 dividieren.

Normale Integer sind vorzeichenbehaftet.

>Das Problem ist, dass die oberen zwei Bits mit 1 gefüllt werden
>(entspricht dann nicht einer Division durch 4).

Doch, nur halt mit Vorzeichen. Das nennt man arithmetisches 
Rechtsschieben. Dort wird das oberste Bit (MSB) nachgeschoben. Im 
Gegensatz zum logischen Rechtsschieben, dort wird immer 0 nachgeschoben.

> Wie stelle ich das am einfachsten an, dass diese mit 0 gefüllt werden?

Die Variable als unsigned definieren.

von vn nn (Gast)


Lesenswert?

Weil du eine negative vorzeichenbehaftete Zahl shiftest.
https://en.wikipedia.org/wiki/Arithmetic_shift#Non-equivalence_of_arithmetic_right_shift_and_division

Einfach durch vier dividieren, der Compiler weiß schon selbst wie er das 
optimieren soll.

von Carl D. (jcw2)


Lesenswert?

vn nn schrieb:
> Einfach durch vier dividieren, der Compiler weiß schon selbst wie er das
> optimieren soll.

Aber er korrigiert nicht selbstständig Fehler im Code, z.b. einen 
falschen Datentyp.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

vn nn schrieb:
> Einfach durch vier dividieren, der Compiler weiß schon selbst wie er das
> optimieren soll.

Wenn Du eine negative Zahl durch 4 teilst, bleibt sie negativ - und 
damit auch weiterhin das oberste Bit gesetzt. Genau, was der TO 
vermeiden wollte. Du hast also mit dem Teilen gegenüber dem Schieben gar 
nichts gewonnen.

von Der Andere (Gast)


Lesenswert?

Hier wäre es sinnvoll sich mal etwas mit den Grundlagen zu beschäftigen. 
Sprich zum einen mit den Zweierkomplement für die Darstellung negativer 
Zahlen und mit dem Unterschied zwischen logical und arithmetic shifting.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.