IT-Academy Logo
Sign Up Login Help
Home - Programmieren - C++ - Binäre Darstellung in C/C++



Binäre Darstellung in C/C++

In diesem Artikel wird die Binäre Darstellung in C/C++ mit Hilfe einer Union erläutert.


Autor: Christian Scheffler (@tention)
Datum: 07-09-2004, 21:55:28
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 20739x
Rating: 7 (3x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Das Problem

Möglicherweise haben Sie sich schon einmal gefragt, wie es möglich ist, eine dezimale Zahl z.B. vom Typ unsigned int binär darzustellen. Dies kann man auf mehrere Arten erreichen. Ich möchte hier eine Art vorstellen, die sich einer sogenannten "negativen" Eigenschaft eines C/C++ Sprachkonstruktes bedient.

Unions

Eine Union, die ja sicherlich jedem C/C++-Programmierer bekannt ist, hat die "negative" Eigenschaft, dass jede Eigenschaft der Union in ein und demselben Speicherbereich liegt und die Größe des Speicherbereiches sich nach der größten verwendeten Eigenschaft richtet. Setzt man die Union in anderen Lösungen ein, kann sich das als negativ auswirken, doch für dieses Vorhaben erweist sich diese Eigenschaft als sehr positiv.

Das Bitfeld

Ein Bitfeld ist eine normale Struktur, die aber Variablen mit unterschiedlicher Bit-Größe beinhalten kann. Solch eine Variable wird folgendermaßen deklariert:

unsigned int name : 3;
Diese Deklaration bedeutet, dass eine Variable mit einer Größe von 3-Bit angelegt wird, welche somit Zahlen von 0-7 aufnehmen kann. Interessant dabei ist nun, dass in solch einem Bitfeld ausschließlich Variablen dieses Typs vorkommen. Für unser Beispiel mit einer 8-Bit Variablen sieht das Ganze so aus.

struct bitfeld_8
    {
        unsigned int bit00 : 1;
        unsigned int bit01 : 1;
        unsigned int bit02 : 1;
        unsigned int bit03 : 1;
        unsigned int bit04 : 1;
        unsigned int bit05 : 1;
        unsigned int bit06 : 1;
        unsigned int bit07 : 1;       
    } bitfeld;
Man könnte nun solch ein Bitfeld auch für Flags benutzen, da wirklich pro Variable nur ein Bit reserviert ist und nicht wie beim Datentyp BOOL, je nach Compiler 1-4 Byte reserviert werden. Somit ist diese Art, Flags zu setzen, ressourcenschonend.

Binäre Darstellung

Das Bitfeld kann beliebig erweitert werden, um z.B. auch Variablen mit 32 oder 64 Bit darzustellen, doch für dieses Beispiel reicht ein Bitfeld für eine 8-Bit Variable aus. Nun muss dieses Bitfeld zusammen mit einer 8-Bit Variable in eine Union gepackt werden. Das sieht folgendermaßen aus:

typedef union union_bitfeld
{
    unsigned char value;
    struct bitfeld_8
    {
        unsigned int bit00 : 1;
        unsigned int bit01 : 1;
        unsigned int bit02 : 1;
        unsigned int bit03 : 1;
        unsigned int bit04 : 1;
        unsigned int bit05 : 1;
        unsigned int bit06 : 1;
        unsigned int bit07 : 1;       
    } bitfeld;
} ubf8; 
Eine Deklaration einer Variablen dieses neuen Konstrukts sieht wie folgt aus:

ubf8 binaerdarstellung;
Über den Namen binaerdarstellung könnte nun die Variable value initialisiert werden. Und genau jetzt macht sich der vermeintliche Nachteil einer Union bemerkbar. Ist ein Wert in der Variablen value gespeichert, somit liegt er auf dem selben Speicherbereich wie unser Bitfeld und kann nun binär ausgelesen werden.

binaerdarstellung.value = 127;
printf("%1d - Bit 3", binaerdarstellung.bitfeld.bit03);
Hier initialisieren wir die Variable value mit dem Wert 127, lesen dann das 3te Bit aus, also das Bit an vierter Stelle des Bitfeldes. Dessen Wert müsste nun 1 betragen. Nun könnten Sie den Wert des Bits z.B. auf 0 ändern, wodurch sich ebenfalls der Wert der Variablen value auf 119 ändert. Um einen Wert komplett binär darzustellen, können Sie alle Variablen des Bitfeldes ausgeben lassen, zu beachten ist dabei aber, dass Sie mit dem höchstwertigem Bit anfangen, hier bit07 und beim Bit mit dem niedrigsten Wert aufhören, hier bit00. Mit der Funktion printf() sieht dies wie folgt aus:

printf("%d - %1d%1d%1d%1d%1d%1d%1d%1d",
                        binaerdarstellung.value;
                        binaerdarstellung.bitfeld.bit07,
                        binaerdarstellung.bitfeld.bit06,
                        binaerdarstellung.bitfeld.bit05,
                        binaerdarstellung.bitfeld.bit04,
                        binaerdarstellung.bitfeld.bit03,
                        binaerdarstellung.bitfeld.bit02,
                        binaerdarstellung.bitfeld.bit01,
                        binaerdarstellung.bitfeld.bit00);
Ich hoffe, ich konnte eine Anregung geben, wie man Variablen binär darstellen kann.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06246
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1154
Comments: 0