byte umdrehen?



  • 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.


  • Mod

    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 🙂


Anmelden zum Antworten