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
Einen "Befehl" gibt es dafür nicht, aber man kann es mit
1 | byte = (byte << 4) | (byte >> 4); |
machen.
besser so byte = (byte << 4) | ((byte >> 4)&0xf); sonst gehts schief, manchmal. Cheers Detlef
oder gleich so: byte = ((byte << 4)&0xF0) | ((byte >> 4)&0x0F); sonst gehts schief, ganz manchmal...
((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.
@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.
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.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.