Zum Inhalt springen

C++: Byte aus einem Bytearray zusammensetzen.


Pointerman

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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