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


von Tom (Gast)


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

von gast (Gast)


Lesenswert?

mach dir ein makro mit inline assembler...

von johnny.m (Gast)


Lesenswert?

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

von Detlef _. (detlef_a)


Lesenswert?

besser so

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

Cheers
Detlef

von C-Rahul (Gast)


Lesenswert?

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

sonst gehts schief, ganz manchmal...

von Karl H. (kbuchegg)


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.

von johnny.m (Gast)


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.

von C-Rahul (Gast)


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.

von Rolf Magnus (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

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.