Pointerman Geschrieben 12. Juli 2007 Geschrieben 12. Juli 2007 Moin! Ich habe ein Array aus 8 Byte-Werten, die entweder 0 oder 1 enthalten. Jetzt möchte ich aus diese Werte sozusagen als Bits verwenden und mir mein eigenes Byte darus erstellen. Gibt es da einen komfortablen Weg bzw Befehl oder muss ich das Byte mit Hilfe von "|" (OR) und "&" (AND) zusammenbauen? Ich verwende Visual C++ 2005. Danke im Voraus! Zitieren
TDM Geschrieben 13. Juli 2007 Geschrieben 13. Juli 2007 Moin! Gibt es da einen komfortablen Weg bzw Befehl oder muss ich das Byte mit Hilfe von "|" (OR) und "&" (AND) zusammenbauen? Ja, musst du. Aber für sowas kann man Makros schreiben: #define BIT_ 0x000 #define BIT0 0x001 #define BIT1 0x002 #define BIT2 0x004 #define BIT3 0x008 #define BIT4 0x010 #define BIT5 0x020 #define BIT6 0x040 #define BIT7 0x080 #define SETBIT(n, ((n) |= () #define CLEARBIT(n, ((n) &= (~) #define CHECKBIT(n, ((n) & () [/code] Verwendung dürfte sich von selbst erklären. Zitieren
Klotzkopp Geschrieben 13. Juli 2007 Geschrieben 13. Juli 2007 Aber für sowas kann man Makros schreiben:Für so was gibt es eigentlich std::bitset. #include <bitset> int main() { unsigned char bytes[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }; std::bitset<8> bs; for( int i = 0; i < 8; ++i ) { bs.set( i, bytes[i] != 0 ); } unsigned char result = unsigned char( bs.to_ulong() ); }[/code] Aber auch damit braucht man eine Schleife oder einen benutzerdefinierten Funktor. Zitieren
TDM Geschrieben 13. Juli 2007 Geschrieben 13. Juli 2007 Für so was gibt es eigentlich std::bitset. Wieder was gelernt. :beagolisc for( int i = 0; i < 8; ++i ) { bs.set( i, bytes[i] != 0 ); } Rein zum Verständnis: Hat das einen Grund warum du auf != 0 prüfst ? Ich hab grad mal nachgeschaut: bitset& set(size_t n, int val = 1) bitset Sets bit n if val is nonzero, and clears bit n if val is zero. Von daher ist es doch egal, was da für eine Zahl reinkommt, denn es wird in der Funktion so und so nochmal überprüft. Das würde dann zu einer doppelten Prüfung führen -> Performanceverlust. Ja, ich bin ein Perfomancejunkie. (auch Kleinvieh macht Mist.) Zitieren
Klotzkopp Geschrieben 13. Juli 2007 Geschrieben 13. Juli 2007 Hat das einen Grund warum du auf != 0 prüfst ?Ja. Eigenartigerweise ist beim MSVC++ 8 der zweite Parameter von std::bitset::set bool, nicht int. Laut Standard müsste es aber int sein. Wobei auch der Standard da nicht ganz eindeutig ist. In der Auflistung der Member steht als Defaultwert true, in der Detailbeschreibung steht 1. Wenn das bitset standardkonform ist, ist das != 0 im Code überflüssig. Zitieren
TDM Geschrieben 13. Juli 2007 Geschrieben 13. Juli 2007 Ja. Eigenartigerweise ist beim MSVC++ 8 der zweite Parameter von std::bitset::set bool, nicht int. Microsoft halt. Ich würde mich trotzdem an den Standard halten. (Also ein int übergeben) Wenn der zweite Parameter ein bool'scher Wert sein muss und du übergibst ein int, dann wird 0 automatisch als false und Nonzero-Werte als true gehändelt. Du kommst aber auch so zu dem Ergebnis (bool -> int = 0||1). Wie auch immer, ist ja nur eine Stilfrage und daher so oder so egal. Zitieren
Pointerman Geschrieben 13. Juli 2007 Autor Geschrieben 13. Juli 2007 Moin! Danke für eure Antworten! Ich könnte mir des auch noch komfortabler vorstellen, aber ich werds mal ausprobieren. Gruß, Maart Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.