byte umdrehen?
-
Vielleicht ne blöde Frage, aber mir fällt gerade nichts besseres ein um ein byte umzudrehen als so ein Konstrukt:
unsigned char uchar_flip(unsigned char foo){ unsigned char bar=0; unsigned char i=0; for(;i<CHAR_BIT;i++) if(foo & 1 << CHAR_BIT-i-1) bar|=1 << i; return bar; }
Geht das nicht etwas eleganter? Wenn ja wie?
-
unsigned char uchar_flip(unsigned char foo){return foo^255;}
-
Windalf schrieb:
unsigned char uchar_flip(unsigned char foo){return foo^255;}
Nene, den XOR-Operator kenn ich schon
Ich will dass aus:
1101 0000
das wird:
0000 1011
Sorry falls das aus meinem OP nicht klar wurde...
-
hmm spontan würd ich sagen da kommst du um ne schleife die z.b. von 0 bis inkl. 3 läuft nicht drum herum... oder du nimmst als overkill nen lookuptable
-
ohne schleife würd ich´s so machen:
#include <stdio.h> int main (void) { unsigned char i=128; unsigned char tmp=0xff; tmp&=i>>4; tmp|=(i<<4)&0xf0; printf("%d\n", tmp); return 0; }
-
Toll /bin/bash0R, du gibst 8 aus. Aber was hat das mit dem Thema zu tun?
Windalf schrieb:
oder du nimmst als overkill nen lookuptable
Als Overkill würde ich das nicht bezeichnen. Bei 8 Bit sind das doch nur 256 Bytes. Ist vielleicht die effektivste Lösung.
-
groovemaster schrieb:
Toll /bin/bash0R, du gibst 8 aus. Aber was hat das mit dem Thema zu tun?
und wenn Windarf und der andere dir sagen, wie du flip() baust, wundere dich auch nicht. dein code unterstellte das. es ist enorm doof, eine funktion flip zu nennen, wenn reverse drin sein soll.
Windalf schrieb:
oder du nimmst als overkill nen lookuptable
Als Overkill würde ich das nicht bezeichnen. Bei 8 Bit sind das doch nur 256 Bytes. Ist vielleicht die effektivste Lösung.
vielleicht. aber naja, 16 bytes lookuptable tun sicher keinem weh.
unsigned char uchar_reverse(unsigned char x){ static unsigned char lut=""\17\16\15\14\13\12\11\10\7\6\5\4\3\2\1"; return (lut[x>>4])|(lut[x&15]<<4); }
und bitte schreib nie mehr foo und bar als bedeutungstragende variablen.
-
edit: müll
-
volkard schrieb:
und wenn Windarf und der andere dir sagen, wie du flip() baust, wundere dich auch nicht. dein code unterstellte das. es ist enorm doof, eine funktion flip zu nennen, wenn reverse drin sein soll.
Meiner Meinung nach ist weder "flip" noch "reverse" eindeutig. Deswegen auch der Code. Wenn sich den keiner anschaut... naja...
volkard schrieb:
und bitte schreib nie mehr foo und bar als bedeutungstragende variablen.
Ja, schlimm sowas... ich gelobe Besserung...
-
ich sehe dabei folgende Probleme (wenn man strikt konformen Programmcode haben will):
- wie definiertest du ein "byte"? meinst wohl 8 Bit?
- der Standard schreibt nicht vor wie groß ein char ist (mindestens 8 Bit - kann aber auch größer sein)
- außerdem wird doch nicht definiert das ein Bitshiften wirklich einfach alle Bits nach links oder rechts verschiebt - es wird nur gesagt, dass ein Bitshiften der Multiplikation mit einer 2er Potenz gleichkommt
- über die interne Repräsentation von chars wird auch nichts ausgesagt
(ich hab erst ein Buch über C gelesen - könnte sein das ich da etwas missverstehe und meine Problemchen unberechtigt sind)
-
Vertexwahn schrieb:
ich sehe dabei folgende Probleme (wenn man strikt konformen Programmcode haben will):
- wie definiertest du ein "byte"? meinst wohl 8 Bit?
Der Standard sagt, dass ein char CHAR_BIT (limits.h) Bits hat.
Vertexwahn schrieb:
- der Standard schreibt nicht vor wie groß ein char ist (mindestens 8 Bit - kann aber auch größer sein)
Deswegen CHAR_BIT...
Über den Rest kann ich nichts sagen, ich kenne den Standard nicht auswendig.
-
Vertexwahn schrieb:
- außerdem wird doch nicht definiert das ein Bitshiften wirklich einfach alle Bits nach links oder rechts verschiebt - es wird nur gesagt, dass ein Bitshiften der Multiplikation mit einer 2er Potenz gleichkommt
6.5.7p4:
"The result of E1 << E2 is E1 left-shifted E2 bit
positions; vacated bits are filled with zeros. If E1 has an
unsigned type, the value of the result is E1×2E2, reduced
modulo one more than the maximum value representable in the
result type. If E1 has a signed type and nonnegative value,
and E1×2E2 is representable in the result type, then that is
the resulting value; otherwise, the behavior is undefined."
(2E2 soll wohl 2 hoch E2 heißen. Die Formatierung ist bei der Umwandlung ins Textformat verloren gegangen.)- über die interne Repräsentation von chars wird auch nichts ausgesagt
6.2.6.1p3:
"Values stored in objects of type unsigned char shall be
represented using a pure binary notation."6.2.6.2p2
"For signed integer types, the bits of the object
representation shall be divided into three groups: value
bits, padding bits, and the sign bit. There need not be any
padding bits; there shall be exactly one sign bit. Each bit
that is a value bit shall have the same value as the same
bit in the object representation of the corresponding
unsigned type (if there are M value bits in the signed type
and N in the unsigned type, then M<=N). If the sign bit is
zero, it shall not affect the resulting value. If the sign
bit is one, then the value shall be modified in one of the
following ways:-- the corresponding value with sign bit 0 is negated;
-- the sign bit has the value -2N;
-- the sign bit has the value 1-2N."
Es gibt auch noch nen Satz, der sagt, dass char ein integer type ist, aber den such ich jetzt nicht raus. Ich glaube, du solltest bei aller Begeisterung manchmal einfach die Kirche im Dorf lassen. Sicher sind manche Sachen im Standard offen gelassen, die man vorher für selbstverständlich gehalten hatte, aber deshalb ist nicht gleich alles undefiniert.
-
sorry, ich dacht an die funktion rotate, aber der fragesteller will das ja gar nicht. Sorry mein Fehler.
-
/bin/bash0R schrieb:
sorry, ich dacht an die funktion rotate, aber der fragesteller will das ja gar nicht. Sorry mein Fehler.
cool. jetzt haben wir flip, reverse und rotate im spiel.
-
volkard schrieb:
/bin/bash0R schrieb:
sorry, ich dacht an die funktion rotate, aber der fragesteller will das ja gar nicht. Sorry mein Fehler.
cool. jetzt haben wir flip, reverse und rotate im spiel.
Ich bring gerne Abwechslung in eine Diskussion