C Programmierung

Hallo,
ich mühe mich gerade mit einem C-Programm ab. Verstehe C ganz gut, habe aber noch nie mir Bit-Manipulationen gearbeitet, und damit Mühe ich mich gerade ab. Ich hoffe hier kann mir jemand helfen, bzw. mir erklären warum es so ist! In einem Beispielprogramm ist folgende Funktion vorhanden;

void display(unsigned char No)
{
digitalWrite(23,(No & B00001000)); // B00001000 ist gleich 8
digitalWrite(22,(No & B00000100)); // B00000100 ist gleich 4
digitalWrite(1, (No & B00000010)); // B00000010 ist gleich 2
digitalWrite(3, (No & B00000001)); // B00000001 ist gleich 1
}

Ran = random(1,16); // zufallszahl zwischen 1 und 15
Display/Ran);

wenn Ran nun 15 ist ergibt 15 & 8 laut C B0000 1000
und
15 & 2 B0000 0010

wie wird jetzt entschieden ob eine LED Eingeschaltet wird oder Ausgeschaltet wird. Nach den 1 4-Bits oder nach den 2 4-Bits? Das ist mir nicht klar. Habe auch keine gute Erklärung dafür gefunden. Würde mir ebenfalls helfen, wenn jemand dafür eine Info empfehlen könnte.

Reinhold

was ist das?
das? Display(Ran);

ok. dann je nach eingeschaltetem Bit wird entsprechende digitalWrite ausgeführt.
wenn Ran ist 0 dann keinen Ausgang wird HIGH; (wird natürlich nicht passieren)
wenn ran ist 15, dann alle 4 werden High.

Arduino ist C++.

https://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators

Wenn der & Operator Null liefert wird das als LOW gewertet, alles andere als HIGH.

& ist bitweises AND

also
0 & 0 ist 0
0 & 1 ist 0
1 & 0 ist 0
1 & 1 ist 1
und das für jedes Bit der 8 Bit Zahl, also bit 0 mit bit 0 , bit 1 mit bit1 usw.

dann ist:

digitalWrite(23,(No & B00001000));

alle Bit die 0 sind werden 0
das Bit 3 (0000 1000) wird mit bit 3 der Variableninhaltes AND verknüpft. Ist es 0 dann kommt 0 raus.
Ist es 1 (oder Dezimal 8 oder eine Zahl wo das bit 3 gesetzt ist) kommt was anderes als 0 heraus und damit TRUE und der Ausgang 23 wird auf HIGH gesetzt. ( TRUE == HIGH == 1 )

Was aber combie ohne Umschweife bereits gesagt hat.

Grüße Uwe

Wobei digitalWrite ein Byte erwartet (kein bool), der & Operator aber auch größere Datentypen kann.

(Hier nicht relevant)

const int ones = 0xFFFF; // alle Bits gesetzt
if (ones & 256) Serial.println ("true");
digitalWrite (LED_BUILTIN, ones & 256); // Led bleibt aus

Da hast du Wahr!
Man sollte sich nicht nur über die Operatoren kundig machen, sondern auch über die impliziten Konvertierungsregeln. Sich vielleicht gar ein C++ Grundlagenbuch anschaffen.

Da der TO hier byte (unsigned char) verwendet, fällt die automatische Konvertierung nicht ins Gewicht.
Aber sonst: Du, Wahr!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.