Zum Inhalt springen

C++: Byte aus einem Bytearray zusammensetzen.


Empfohlene Beiträge

Geschrieben

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!

Geschrieben
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.

Geschrieben
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.

Geschrieben
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. :rolleyes:

(auch Kleinvieh macht Mist.)

Geschrieben
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.

Geschrieben
Ja. Eigenartigerweise ist beim MSVC++ 8 der zweite Parameter von std::bitset::set bool, nicht int.

Microsoft halt. :rolleyes:

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. ;)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...