C# Bitmanipulation

Gast #1880732
Lesenswert?

Hi ich habe ein kleines Problem bei C# und zwar wollte ich eine Variable 
vom Datentyp Byte überprüfen. Die Variable befindet sich in einer 
Klasse. Wenn ich allerdings versuche in einer If-Abfrage das die erste 
Stelle des Bytes zu überprüfen also:

if(globalVar._Byte[0] & 0x01){} kommt immer eine Fehlermeldung.

Könnt ihr mir vielleicht sagen was ich falsch gemacht habe? Oder sagen 
wie ich es richtig mache? ich habe vor das ganze Byte abzufragen also 
jede der 8 Stellen. Bisher kenne ich das nur als Und-Verknüpfung.

Gruß
Gast #1881230
Lesenswert?

Reinhard Kern schrieb:
> bän schrieb:
>> if(globalVar._Byte[0] & 0x01){} kommt immer eine Fehlermeldung.
>
> Wieso _Byte[0]? ist das ein array?
>
> Gruss Reinhard

Da hat er recht! Du kannst die Bits zB. so abfragen:
1
public delegate TResult Func<TArg0, TResult>(TArg0 arg0);
2
public delegate TResult Func<TArg0, TArg1, TResult>(TArg0 arg0, TArg1 arg1);
3

4
static void Main(string[] args)
5
{
6
   Func<byte,bool> quest = x => (x & 0x1) == 0x1;
7
   Func<byte,byte,bool> quest2 = (x,y) => (x & 1 << y) >= 1;
8
   for(byte i  = 0x0; i < 0x10; i++) // Bit 0 gesetzt beo 0 bis 9?
9
       Console.WriteLine(string.Format("{0} : {1}",i,quest(i)));
10

11
   for (byte i = 0; i < 8; i++) // Welche stellen bei 0x11 ?
12
       Console.Write(string.Format("{0} : ", quest2(0x11, i)));
13
            
14
   Console.Read();
15
}
Gast #1881302
Lesenswert?

Hallo

das kommt daher das C# stark typisiert ist, eine If Abfrage verlangt 
eine Boolschen Wert. Wenn du 2 ints mit & kombinierst kommt als Ergebnis 
wieder ein int heraus.

Deshalb musst du es so schreiben:

if ((this.test & 0x01) > 0)

Womit du aus dem int ein bool machst

fz
Gast #1881787
Lesenswert?

Also ich will ein Byte durch einen Tastendruck oder Loslassen der Taste 
verändern. Es gibt 8 mögliche Tasten und die verändern also jeweils ein 
Bit im Byte. Das Byte wird hinterher über die Serielle Schnittstelle mit 
der Funktion Write(); versendet. Ich habe mich für ein Byte Array 
entschieden, weil ich ja keinen String mit dem Mikrocontroller auslesen 
will sondern nur ein einziges Byte verschicken will. Die Funktion Write 
bietet auch die Möglichkeit ein Byte-Array zu versenden und das kam 
meinen Vorstellungen am nächsten.

Vielleicht könnt ihr mir ja sagen was ich genau falsch mache. Also die 
Klasse in der das Byte-Array ist sieht so aus:
1
public static class globalVar
2
    {
3
        public static SerialPort Port;
4
        public static byte[] Tastenkombination = { 0 };
5
    }

Hier ist das KeyDown-Event das KeyUp-Event sieht ebenfalls so aus:
1
private void Form1_KeyDown(object sender, KeyEventArgs e)
2
        {
3
            if (e.KeyData == Keys.Up)
4
            {
5
                globalVar.Tastenkombination[0] ^= 0x08;
6
            }
7
globalVar.Port.Write(globalVar.Tastenkombination[0].ToString());
8
}

Jetzt will ich in der Abfrage der Taste noch einbringen ob die Taste 
nicht schon den Wert geändert hat und dachte mir ich kann einfach mit "& 
0x08" das Byte vergleichen und erhalte dementsprechend true oder false.

Wie mache ich diese Abfrage denn sinnvoll und richitg? Ist es für das 
Senden mit der Seriellen Schnittstelle von Bedeutung ob es jetzt ein 
String ist oder ein Byte als Datentyp? Für einen kleinen Test im 
Hypterterminal habe ich einfach mal die Funktion .ToString(); verwendet.

Gruß Bän
Gast #1882925
Lesenswert?

@bän

Steht doch alles in meinem Beispiel! Manchmal hilft auch ein Blick in 
die Sprach-Standards. Gerade die MSDN lässt sich da gut aus. Aber ohne 
grundlegendes Wissen über die gewählte Sprache wirst Du auch mit allen 
Beispielen im Trüben fischen. Da musst Du halt durch ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren