mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

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!

Autor: Dominik S. (dasd) Flattr this
Datum:

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

Autor: Norbert (Gast)
Datum:

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

Autor: Falk B. (falk)
Datum:

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.

Autor: vn nn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil du eine negative vorzeichenbehaftete Zahl shiftest.
https://en.wikipedia.org/wiki/Arithmetic_shift#Non...

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

Autor: Carl D. (jcw2)
Datum:

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.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

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.

Autor: Der Andere (Gast)
Datum:

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.