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 ?
-
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"); } }
-
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...)
-
Übrigens,
seit C++11 gehtdas 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

-
bitset::to_string gab es doch schon immer oder welches C++11-Feature meinst du in deinem Code?
-
SeppJ schrieb:
bitset::to_string gab es doch schon immer
Merkwürdig. Ich dachte,
bitsetgibt es erst seit C++11... oder TR1...?
-
Arcoth schrieb:
SeppJ schrieb:
bitset::to_string gab es doch schon immer
Merkwürdig. Ich dachte,
bitsetgibt 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.
-
Oh. Vielen Dank für die Klarstellung.
