mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik swap-befehl in C?


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
morgen!
kann mir jemand sagen ob es in C einen Befehl gibt der das selbe macht 
wie der Assembler-Befehl "Swap"(sprichen der die nibbles eines Bytes 
tauscht).
MFG
Tom

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach dir ein makro mit inline assembler...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen "Befehl" gibt es dafür nicht, aber man kann es mit
byte = (byte << 4) | (byte >> 4);
machen.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
besser so

byte = (byte << 4) | ((byte >> 4)&0xf);
sonst gehts schief, manchmal.

Cheers
Detlef

Autor: C-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder gleich so:
byte = ((byte << 4)&0xF0) | ((byte >> 4)&0x0F);

sonst gehts schief, ganz manchmal...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
((byte << 4)&0xF0)

Wozu willst du den &0xF0?

Beim Linksschieben kommen von rechts immer 0-en nach.

((byte >> 4)&0x0F);

Der ist in Ordnung. Abhängig davon ob byte signed oder
unsigned ist und vom tatsächlichen Wert von byte können
da von links auch 1-en reingeschoben werden.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:
Jau, ist natürlich richtig. Ich war jetzt von unsigned ausgegangen, da 
es i.d.R. auch wenig Sinn macht, was vorzeichenbehaftetes zu "swappen". 
Aber man weiß ja nie, wo die Leute so drauf kommen und auch was der 
Compiler draus macht. Die Methode von C-Rahul ist mit Sicherheit die 
sicherste.

Autor: C-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
darum habe ich auch geschrieben "ganz manchmal".
Denn ich verlasse mich nicht darauf, dass der Compiler das Carry vorher 
löscht oder einen Assemblerbefehl benutzt, sofern vorhanden, welcher 
automatisch Nullen nachschiebt.
Aber ein einfacher Blick in den assemblierten Code hilft natürlich auch, 
ob man sich diese Gaudi sparen kann.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Denn ich verlasse mich nicht darauf, dass der Compiler das Carry vorher
> löscht oder einen Assemblerbefehl benutzt, sofern vorhanden, welcher
> automatisch Nullen nachschiebt.

Es soll ja Compiler geben, denen die C-Norm vollkommen egal ist, aber 
bei einem halbwegs vernünftigen Compiler kannst du dich schon darauf 
verlassen, daß er solch triviale Dinge korrekt umsetzt. Wenn nicht, 
würde ich ihn wegwerfen und durch einen besseren ersetzen.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C-Rahul wrote:
> darum habe ich auch geschrieben "ganz manchmal".
> Denn ich verlasse mich nicht darauf, dass der Compiler das Carry vorher
> löscht oder einen Assemblerbefehl benutzt, sofern vorhanden, welcher
> automatisch Nullen nachschiebt.

Das steht in der Definition des <<-Operators. Wenn du deinem C-Compiler 
die korrekte Umsetzung eines so einfachen Operators nicht zutraust, dann 
ist wohl ein Wechsel eine gute Idee.

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.