Wie ändert man ein Byte auf Bit Ebene in C++?



  • Gibt es in C++ eine Möglichkeit einzelne Bits in einem Byte zu ändern?

    Wenn ich z.B. eine Char Variable mit dem Wert 'B' habe (entspricht 0100 0010) und möchte nun das 5. Bit und 6.Bit von rechts gesehen in eine 1 ändern,
    so daß 0111 0010 herauskommt, wie mache ich das am besten in C++?

    Gibt's dafür Operatoren um direkt auf ein Bit zugreifen zu können?



  • oh man sowas kann man in jedem buch oder tutorial nachgucken



  • Ja, dafür gibt es die bitweisen Operatoren:

    & Bitweises und
    | Bitweises oder
    ^ Bitweises exklusives oder

    Wenn du den Operator auf zwei Chars anwendest, verhalten sich die Operatoren jeweils so:

    & - der resultierende Char hat da eine 1, wo beide Eingabe-Chars eine 1 haben.
    | - der resultierende Char hat da eine 1, wo eines der beiden Eingabe-Chars eine 1 hat.
    ^ - der resultierende Char hat da eine 1, wo nur eine der beiden Eingabe-Chars eine 1 hat.

    Für deinen Fall heißt das z.B.:

    0100 0010 (B)
    | 0111 0010 (114)
    = 0111 0010
    

    NATÜRLICH HÄTTEST DU AUCH GOOGLE BEMÜHEN KÖNNEN ABER ICH HABE GERADE MEINEN SOZIALEN TAG! :schland:



  • Bitwise schrieb:

    Ja, dafür gibt es die bitweisen Operatoren:

    & Bitweises und
    | Bitweises oder
    ^ Bitweises exklusives oder

    Wenn du den Operator auf zwei Chars anwendest, verhalten sich die Operatoren jeweils so:

    & - der resultierende Char hat da eine 1, wo beide Eingabe-Chars eine 1 haben.
    | - der resultierende Char hat da eine 1, wo eines der beiden Eingabe-Chars eine 1 hat.
    ^ - der resultierende Char hat da eine 1, wo nur eine der beiden Eingabe-Chars eine 1 hat.

    Für deinen Fall heißt das z.B.:

    0100 0010 (B)
    | 0111 0010 (114)
    = 0111 0010
    

    NATÜRLICH HÄTTEST DU AUCH GOOGLE BEMÜHEN KÖNNEN ABER ICH HABE GERADE MEINEN SOZIALEN TAG! :schland:

    Aber das ist genau das was ich ja nicht will!

    Ich will nicht einfach B mit r kombinieren um dann das Ergebnis zu erreichen, sondern ich will sagen können:

    Ändere das Bit an Stelle X von Char.
    Mit Assembler geht so etwas nämlich ohne Probleme.
    Selbst ADA liefert dazu extra Werkzeuge um so etwas gezielt zu machen.

    Und das man mit einem weiteren Char und der Kombination so etwas ändern kann, das weiß ich auch selber.

    Und jetzt kommt ihr beiden!



  • 😃 👍


  • Mod

    Bitoperator schrieb:

    Wenn ich z.B. eine Char Variable mit dem Wert 'B' habe (entspricht 0100 0010) und möchte nun das 5. Bit und 6.Bit von rechts gesehen in eine 1 ändern,
    so daß 0111 0010 herauskommt, wie mache ich das am besten in C++?

    Indem du in C++ vorhandene Operatoren geeignet verknüpfst. Dafür kann man dann auch eine Funktion schreiben.

    unsigned char flip(unsigned char v, int bit) { return v ^ ( 1 << bit ); }
    

    Gibt's dafür Operatoren um direkt auf ein Bit zugreifen zu können?

    Nein, wären auch redundant. C und C++ haben allgemein schon eher zu viele Operatoren.



  • camper schrieb:

    C und C++ haben allgemein schon eher zu viele Operatoren.

    habs irgendwann mal nachgezählt. C hat 47 operatoren. ist schon 'ne ganze menge.
    🙂



  • du hast also quasi folgendes gefragt:

    ich habe die zahl 835 und möchte nur die 8 haben bzw bearbeiten

    aber plus minus mal und geteilt sind verboten...



  • du hast also quasi folgendes gefragt:

    ich habe die zahl 835 und möchte nur die 8 haben bzw bearbeiten

    aber plus minus mal und geteilt sind verboten...

    das geh auch mit bitoperatoren^^



  • std::bitset?



  • er wollte glaub ehr C stil



  • bitset ist nicht langsamer als eine reine c-implementierung, aber deutlich eleganter. es spricht daher wenig gegen diese möglichkeit.



  • Hier ist der typische Stil bei der Mikroprozessor-Programmierung in C:

    PORTx |=  (1 << BitNummer); //bit setzen
    PORTx &= ~(1 << BitNummer); //bit löschen
    ADCSRA =  (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); //mehrere bits setzen
    

    Ich hoffe, das hilft etwas weiter.



  • Bitoperator schrieb:

    ...Gibt's dafür Operatoren um direkt auf ein Bit zugreifen zu können?

    Soweit ch weiß, nicht ... allerdings hat das nichts mit C++ zu tun, sondern damit, wie ein Rechner seinen Speicher adressiert und dessen Inhalt verändert - und wenn der Rechner das nicht bitweise tut, kann das auch keine Programiersprache der Welt ändern.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    und wenn der Rechner das nicht bitweise tut, kann das auch keine Programiersprache der Welt ändern.

    dann ist das aber ein rechner, für den weder C noch C++ compiler existieren. oder nur solche abgespeckten varianten, die keine bitoperatoren haben.
    🙂



  • Wo ist das Problem? 😕



  • Erhard Henkes schrieb:

    Wo ist das Problem? 😕

    das ist hier die frage 😃



  • fricky schrieb:

    Simon2 schrieb:

    und wenn der Rechner das nicht bitweise tut, kann das auch keine Programiersprache der Welt ändern.

    dann ist das aber ein rechner, für den weder C noch C++ compiler existieren. oder nur solche abgespeckten varianten, die keine bitoperatoren haben.
    🙂

    Das hast Du falsch verstanden. Es gibt keine Rechner, die bitweise Adressierung erlauben. Zumindest keine, die mir bekannt wären.



  • Es wäre ein leichtes, eine Sprache zu entwerfen, die mit Operatoren Bit-Zugriff erlaubt. Lässt sich sicher auch recht einfach in C++ implementieren, zumindest das Setzen und Löschen eines Bits 🙂



  • Lässt sich sicher auch recht einfach in C++ implementieren, zumindest das Setzen und Löschen eines Bits.

    Ja, genau.

    #include <iostream>
    using namespace std;
    
    void setbit( unsigned short *target, unsigned char bitnumber) //bit setzen
    {
        *target |=  (1 << bitnumber);
    }
    
    void clearbit( unsigned short *target, unsigned char bitnumber) //bit löschen
    {
        *target &= ~ (1 << bitnumber);
    }
    
    int main()
    {
        unsigned short zahl = 0;
        unsigned short bitnumber;
        cout << "Geben Sie bitte das zu behandelnde Bit ein (0-15): ";
        cin >> bitnumber;
        setbit(&zahl, bitnumber);
        cout << zahl << endl;
        clearbit(&zahl, bitnumber);
        cout << zahl << endl;
        return 0;
    }
    

Anmelden zum Antworten