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