Char bitweise auslesen



  • Hallo

    ich versuche gerade einen Char bitweise auszulesen und die ausgelesenden 1 und 0 in einen String zu speichern.

    char c = entropiePictureBinarieCodeCharVector[i];		
    
    		for (int j = 0; j < 8; ++j) {
    
    			if (((c |= 1 >> j) == 1)){
    				readedBinarieCode.append("1");
    			}
    			else { 
    				readedBinarieCode.append("0");
    			}
    		}
    

    Leider funktioniert dieser Code nicht hat jemand eine Idee ?


  • Mod

    Links schieben, nicht rechts.



  • SeppJ schrieb:

    Links schieben, nicht rechts.

    Das heißt ?



  • ungetestet

    unsigned char c = 'M';
    std::string bits;
    for(unsigned i = 0; i < std::numeric_limits<unsigend char>::digits; i++)
    {
        bits.push_back('0' + (c & (1 << i)));
    }
    


  • safasfd schrieb:

    ungetestet

    unsigned char c = 'M';
    std::string bits;
    for(unsigned i = 0; i < std::numeric_limits<unsigend char>::digits; i++)
    {
        bits.push_back('0' + (c & (1 << i)));
    }
    

    Danke so hat es funktioniert 🙂

    for (int i = 0; i < entropiePictureBinarieCodeCharVector.size(); i++) {
    
    		char c = entropiePictureBinarieCodeCharVector[i];		
    
    		for (int j = 0; j < 8; ++j) {
    
    			if (((c & (1 << j)) == 0)){
    				readedBinarieCode.append("0");
    			}
    			else {
    				readedBinarieCode.append("1");
    			}
    		}
    

  • Mod

    pluspluscoder schrieb:

    SeppJ schrieb:

    Links schieben, nicht rechts.

    Das heißt ?

    << statt >>.

    1 >> 1 ist nämlich 0 (die 1 wurde rechts aus der Zahl raus geschoben). 1 << 1 hingegen 2 (binär 10, also die 1 um 1 nach links geschoben).



  • sollte performance für dich ein thema sein, dann solltest du das anders lösen:
    1. du entscheidest mit einem if-else-block statt einfach zu addieren so wie ich in meinem code.
    2. um ein einzelnes zeichen einzufügen nutzt du append und ein string-literal, so dass der string erstmal zählen muss wie lange dein string ist usw..
    3. da du von einem unsigned char weisst, wie viele bits es hat (nämlich std::numeric_limits<unsigend char>::digits (wieso nutzt du übrigens 8? macht das ganze doch nur unportibler...)), dann kannst du im voraus den string resizen und die chars mit dem subscript operator ändern (new / new[] ist extrem teuer! auch obwohl der string intern reservieren kann, das ist mir schon bewusst...)


  • Mod

    Übrigens, seit C++11 geht das geht deutlich direkter:

    unsigned char c = 'M';
    std::cout << std::bitset<CHAR_BIT>(c).to_string();
    

    Ebenfalls ungetestet.



  • Arcoth schrieb:

    Übrigens, seit C++11 geht das deutlich direkter:

    unsigned char c = 'M';
    std::cout << std::bitset<CHAR_BIT>(c).to_string();
    

    Ebenfalls ungetestet.

    Ich werde übermorgen nochmal versuchen das Problem zu lösen bei dem Code den ich oben gepostet habe bekomme ich momentan immer noch Probleme also nen Flachen Code ausgegeben . Ich werden es dann auch nochmal mit deiner Lösung ausprobieren.

    Danke für die schnellen Antworten sobald ich das ausprobiert werde ich nochmal berichten ob es funktioniert hat 😉


  • Mod

    bitset::to_string gab es doch schon immer oder welches C++11-Feature meinst du in deinem Code?


  • Mod

    SeppJ schrieb:

    bitset::to_string gab es doch schon immer

    Merkwürdig. Ich dachte, bitset gibt es erst seit C++11... oder TR1...?


  • Mod

    Arcoth schrieb:

    SeppJ schrieb:

    bitset::to_string gab es doch schon immer

    Merkwürdig. Ich dachte, bitset gibt es erst seit C++11... oder TR1...?

    Gibt's schon mindestens seit C++98. Es war Teil der Original-STL und ist mit dieser in den Sprachstandard eingeflossen.


  • Mod

    Oh. Vielen Dank für die Klarstellung. 👍


Anmelden zum Antworten