mikrocontroller.net

Forum: PC-Programmierung C# Bitmanipulation


Autor: bän (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: _M_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Meldung kommt denn?

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

Autor: Reinhard Kern (Gast)
Datum:

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

Wieso _Byte[0]? ist das ein array?

Gruss Reinhard

Autor: Martin Z. (zilluss)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: oliver.punk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
public delegate TResult Func<TArg0, TResult>(TArg0 arg0);
public delegate TResult Func<TArg0, TArg1, TResult>(TArg0 arg0, TArg1 arg1);

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

   for (byte i = 0; i < 8; i++) // Welche stellen bei 0x11 ?
       Console.Write(string.Format("{0} : ", quest2(0x11, i)));
            
   Console.Read();
}

Autor: fz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bän (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
public static class globalVar
    {
        public static SerialPort Port;
        public static byte[] Tastenkombination = { 0 };
    }

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

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sollte heißen:
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.

Autor: oliver.punk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.