mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Chris (Gast)


Bewertung
0 lesenswert
nicht 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) Flattr this


Bewertung
0 lesenswert
nicht lesenswert
Deine Variable muss vor den SHiften unsigned sein.

von Norbert (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.