Forum: PC-Programmierung C# Bitmanipulation


von bän (Gast)


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ß

von _M_ (Gast)


Lesenswert?

Welche Meldung kommt denn?

Wenn ich z.B. "if ((this.test & 0x01) > 0)" schreibe gehts.

von Reinhard Kern (Gast)


Lesenswert?

bän schrieb:
> if(globalVar._Byte[0] & 0x01){} kommt immer eine Fehlermeldung.

Wieso _Byte[0]? ist das ein array?

Gruss Reinhard

von Martin Z. (zilluss)


Lesenswert?

Es wäre vielleicht auch hilfreich zu wissen was für eine Fehlermeldung 
kommt...

Ich vermute das 0x01 vom Compiler als Int32 Konstante interpretiert wird 
und das nicht klappt weil globalVar._Byte[0] vom Typ byte ist. Ein cast 
sollte das beheben.

von oliver.punk (Gast)


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
}

von fz (Gast)


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

von bän (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

bän schrieb:
> Wie mache ich diese Abfrage denn sinnvoll und richitg?
Wie wäre es mit LESEN ?
Ich sehe auf Anhieb zwei Lösungen die genau diese Frage beantworten!

von Sven H. (dsb_sven)


Lesenswert?

Es sollte heißen:
1
if ((this.test & 0x01) == 0x01)

Für deinen Fall geht es auch mit "> 0" aber wenn du nicht nur ein Bit 
prüfen willst, musst du genau mit dem zu prüfenden Wert vergleichen.

von oliver.punk (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.