Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C++: Byte aus einem Bytearray zusammensetzen.

Empfohlene Antworten

Veröffentlicht

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!

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.

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.

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

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.