Byte- bzw. Bitvergleich



  • Hallo,

    mein Problem ist folgendes. Titel ist vielleicht etwas irreleitend :).

    Ich habe zwei Byte; in einem Byte soll das Bit an einer Stelle so gesetzt werden, wie das Bit des anderen Bytes.
    Die entsprechende Stelle sei nun das letzte Bit.
    Beispiel:

    --------
    00011010 Byte
    10000000 Musterbyte
    --------
    10011010 Ergebnis
    

    Das ist ja leicht zu erreichen, einfach mittels eines |.
    Aber wenn ich

    --------
    10011010 Byte (diesmal das letzte Bit gesetzt)
    00000000 Musterbyte
    --------
    00011010 Ergebnis
    

    mache, klappt das zunächst nicht. Ein & geht nicht, da der Vergleich sonst 0 zurückliefert, ein | würde nichts verändern.

    Vielleicht sehe ich den wald vor lauter Bäumen nicht, denn ich glaube ehrlich gesagt nicht, dass das so schwer zu realisieren ist, aber könnte mir bitte wer helfen :)?

    Gesagt sei noch, dass das Stellenbit nicht immer da letzte Bit ist, sondern auch mitten im Byte sein kann (00010000 z.B.)



  • Ich seh das Problem nicht wirklich.

    Wie kommst du denn da drauf:

    --------
    10011010 Byte (diesmal das letzte Bit gesetzt)
    00000000 Musterbyte
    --------
    00011010 Ergebnis
    

    Das Ergebnis muss doch 10011010 lauten. Ich denke mal, du hast einfach nur ein Problem mit signed/unsigned bei der Ausgabe des Ergebnisses (ich gehe mal davon aus, dass du einfach den Wert mit printf ausgibst und der nicht mit deinem selber ausgerechneten Wert übereinstimmt. Wenn der Typ, den du jetzt benutzt signed ist, dann benutze mal unsigned und lass dein Ergebnis nochmal ausgeben.
    %d für signed und %u für unsigned, wenn du es mit printf aufgeben lässt.



  • vielleicht sowas

    unsigned char copy_bit (unsigned char byte, unsigned char musterbyte, int position)
    {
        unsigned char bit = musterbyte & (1<<position);
        return byte & ~bit | bit;
    }
    

    position von 0...7
    (nicht ausprobiert)



  • Nein, nein, so wie ich das will, stimmt das schon 🙂

    Aber ich weiß jetzt auch selbst, wie das zu bewerkstelligen ist.
    Anstatt 00000000 als Muster zu verwenden, nehme ich 01111111 und vergleiche das ganze mit &. Dann kommt auch mein gewünschtes Ergebnis bei raus.
    Ich will ja eben, dass das letzte Bit meines Standardbytes NICHT gesetzt ist, der Rest aber unverändert bleiben soll.

    Trotzdem danke.



  • ganz "einfach":

    erste zahl AND NOT (1 << bitnummer)
    zweite zahl AND (1 << bitnummer)
    beides ORen

    AND und NOT sind dabei & respektive ~

    edit: hm, war wohl zu langsam...


Anmelden zum Antworten