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



  • 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;
    }
    


  • lol da benutzt man referenzen statt zeiger ⚠



  • und was spricht dagegen das mittels std::bitset zu lösen, außer das man weniger code schreiben muss?

    int main()
    {
        std::bitset<std::numeric_limits<unsigned long>::digits> bitset_der_zahl; //default ist alles 0
        unsigned short bitnumber = 0;
        cout << "Geben Sie bitte das zu behandelnde Bit ein (0-"<<std::numeric_limits<unsigned long>::digits-1 <<"): "; //um mal portabel zu programmieren ;)
        cin >> bitnumber;
        bitset_der_zahl[bitnumber]=1;
        cout << bitset_der_zahl.to_ulong() << endl;
        bitset_der_zahl[bitnumber]=0;
        cout << bitset_der_zahl.to_ulong() << endl;
        return 0;
    }
    

    die umwandlung eines bitset von und nach unsigned long ist kostenlos, sobald der compiler ein bisschen optimieren darf, da es sich dabei um die interne repräsentation handelt und alles inline gelöst ist.



  • warning schrieb:

    lol da benutzt man referenzen statt zeiger ⚠

    Da bist Du Dir ja verdammt sicher. – Und warum? Was spricht gegen Zeiger?



  • gibst es jetzt eine flamewar bzgl referenz vs. zeiger?

    bevor das los geht: es ist geschmackssache. der streit lohnt nicht...



  • Konrad Rudolph schrieb:

    warning schrieb:

    lol da benutzt man referenzen statt zeiger ⚠

    Da bist Du Dir ja verdammt sicher. – Und warum? Was spricht gegen Zeiger?

    Warum Zeiger? Ist es sinnvoll NULL zu übergeben?



  • Konrad Rudolph schrieb:

    ⚠ schrieb:

    lol da benutzt man referenzen statt zeiger ⚠

    Da bist Du Dir ja verdammt sicher. – Und warum? Was spricht gegen Zeiger?

    Warum Zeiger? Ist es sinnvoll NULL zu übergeben?



  • SryFalschZitiert schrieb:

    Konrad Rudolph schrieb:

    ⚠ schrieb:

    lol da benutzt man referenzen statt zeiger ⚠

    Da bist Du Dir ja verdammt sicher. – Und warum? Was spricht gegen Zeiger?

    Warum Zeiger? Ist es sinnvoll NULL zu übergeben?

    Das steht hier nicht zur Debatte, es wurde keine solche Behauptung aufgestellt. Aber wer sowas abschätziges wie „lol da benutzt man referenzen statt zeiger ⚠“ schreibt, der sollte das lieber gut begründen können, oder sich ganz schnell in einem Erdloch verstecken.



  • Zeiger sind einfach veraltet



  • dafür kann dir eine methode wenigstens keinen pointer unterm arsch wegreissen, wie das bei referenzen durchaus der fall sein kann.



  • lol da benutzt man referenzen statt zeiger

    Zeiger sind einfach veraltet

    C ist ein Bestandteil von C++. Daher ist hier vermutlich nichts veraltet. Referenzen sind ein anderes Sprachmittel für die gleiche Aufgabe. Also locker bleiben. Man kann dies mit C++-Referenzen lösen. Ich habe Funktionen angegeben, die auch mit C funktionieren, z.B. bei Mikroprozessoren, da man dies gerade dort benötigt.

    und was spricht dagegen das mittels std::bitset zu lösen, außer das man weniger code schreiben muss?

    Nichts, außer der Fast-Unleserlichkeit des Codes und der Tatsache, dass es auch im C-Umfeld funktionieren sollte.



  • pro pointer schrieb:

    dafür kann dir eine methode wenigstens keinen pointer unterm ***** wegreissen, wie das bei referenzen durchaus der fall sein kann.

    😕 😕 😕


Anmelden zum Antworten