Schaltvorgänge mit bitorientierten Operatoren 9. Mai 2012

Meist ist es ja so, dass man mit relativ geringem Aufwand ein größtmögliches Ziel erreichen möchte. Aus diesem Grund möchte ich im folgenden Artikel ein Beispiel für bitorientierte Operatoren unter C# etwas näher erläutern.

Ich selbst stand bspw. mal vor dem Problem eine Datenbank mit vielen Kategorien zu erstellen. Ähnlich wie in solch einem Blog hier sollten Einträge einer oder mehreren Kategorien zugeordnet werden. Eine einfache Variante dies umzusetzen wäre die Arbeit mit bitorientierten Operatoren. Man verpacke alles in ein Byte und arbeitet mit den Bits, mit einer Art Schalterfunktion.

Im nachfolgenden Beispiel hat jedes Bit die Funktion eines Schalters. Damit ist es möglich in einem Byte bis zu 8 Ein-/Aus-Informationen zu speichern.

Hier werden nur 7 Ein-/Aus-Informationen gespeichert, da hier der elementare Datentyp sbyte genutzt wird.
Dieser ist vorzeichenbehaftet und hat folgenden Wertebereich: -27 bis 27-1 (-128 bis 127).
Vorzeichenbehaftete Datentypen speichern im höchstwertigen Bit das Vorzeichen [+/-].

Die Schaltvorgänge werden mit bitorientierten Operatoren realisiert.

Zum leichteren Verständnis habe das Ganze hier am Beispiel eines Lichtschaltersystems für ein Haus dargestellt. Wir steuern also über die einzelnen Bits die Beleuchtung der Räume und NEIN, Dimmer sind hier keine verbaut.

 

Raum

Keller

Bad

Flur

Arbeitszimmer

Schlafzimmer

Küche

Wohnzimmer

BIT-Werte mit Vorzeichenbit

[V]

0

0

1

1

0

1

1

Stellenwert

64

32

16

8

4

2

1

 

/*  Programm für Schaltvorgänge der Räume eines Gebäudes
*  Die Räume Keller, Bad,Flur,Arbeitszimmer,Schlafzimmer, Küche, Wohnzimmer
*  haben Lichtschalter, die hier entsprechend programmiert werden.
*/

using System;
namespace bitOp
{ 

  class Program
{ 

    static void Main(string[] args)
{ 

        //Array erstellen und initialisieren – hier mit den Räumen des Gebäudes
        string[] raum={“Keller”, “Bad”,“Flur”,“Arbeitszimmer”,“Schlafzimmer”, “Küche”, “Wohnzimmer”} ;

        //Variable die die Binärzahl erhält – hier mit 0 initialisiert
        string binaer=\0;

//Typ sbyte ist eine vorzeichenbehaftete 8-Bit Zahl, d.h. höchstwertiges BIT speichert Vorzeichen
        //Wertebereich demnach von -2hoch7 bis (2hoch7)-1 (-128 bis 127)

        //Variable die den Wert der Schalter enthält – hier mit 127 (hexadezimal) initialisiert
        sbyte schaltSchrank = 0x7F; //127 -> 0111 1111 <- in allen Räumen brennt das Licht!

        schaltSchrank&=~127; //Licht in allen Räumen AUS!
        schaltSchrank |= 32; //Bad-Licht AN! – per Bitweise-Operator!
        //auch per arithmetischem Operator möglich: schaltSchrank += 32;

        schaltSchrank ^= 16; //Lichschalter im Flur umschalten – per Bitweise-Operator!
        schaltSchrank |= 3;  //Licht in Wohnzimmer und Küche AN!
        schaltSchrank &= ~3; //Ausschalten von Wohnzimmer (2) und Küche (1)

        //für jedes einzelne BIT (0-6) durchlaufe und prüfe auf 1 bzw. 0
        for (byte i = 0; i <= 6; i++) 

        {
            binaer= (schaltSchrank >> i)%2 + binaer; //Var. binaer erhält zusammengesetzte Binärzahl
            //es erfolgt eine Rechtsverschiebung der BITs um i Stellen und Modulo-Operation 

            if ((schaltSchrank >> i)%2!=0) // wenn BIT ungleich 0… also 1…
                //lies Raum aus dem Array – hier in umgekehrter Reihenfolge gespeichert: also 6-1
                Console.WriteLine(“Schalter vom {0} ist auf AN!”, raum[6-i] );  

            } 

            //Ausgabe der Binärzahl
            Console.WriteLine(“Zahl {0} binär: [V]{1}”,schaltSchrank,binaer); 

            Console.ReadKey(); //Konsolenfenster offen halten, bis Taste gedrückt wird
        }

    }  

}

Testet es und entwickelt es weiter!

Comments are closed.