# C Programmierung

**URL:** <https://forum.arduino.cc/t/c-programmierung/1170004>\
**Category:** Deutsch\
**Created:** [September 19, 2023, 1:27pm UTC](https://forum.arduino.cc/t/c-programmierung/1170004 "2023-09-19T13:27:27Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![kwauka\_1591](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kwauka_1591/32/1001634_2.png) [@kwauka\_1591](https://forum.arduino.cc/u/kwauka_1591)\
**Post date:** [September 19, 2023, 1:27pm UTC](https://forum.arduino.cc/t/c-programmierung/1170004/1 "2023-09-19T13:27:27Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kolaha](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kolaha/32/966427_2.png) [@kolaha](https://forum.arduino.cc/u/kolaha)\
**Post date:** [September 19, 2023, 1:56pm UTC](https://forum.arduino.cc/t/c-programmierung/1170004/2 "2023-09-19T13:56:42Z")

</div>

> [@kwauka\_1591](#):
>
> Display/Ran);

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.

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [September 19, 2023, 3:28pm UTC](https://forum.arduino.cc/t/c-programmierung/1170004/3 "2023-09-19T15:28:56Z")

</div>

> [@kwauka\_1591](#):
>
> Verstehe C ganz gut,

Arduino ist C++.

> [@kwauka\_1591](#):
>
> habe aber noch nie mir Bit-Manipulationen gearbeitet,

[https://en.cppreference.com/w/cpp/language/operator\_arithmetic#Bitwise\_logic\_operators](https://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators)

> [@kwauka\_1591](#):
>
> 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.

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

---

<div class="post-metadata">

**Author:** ![uwefed](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uwefed/32/213736_2.png) [@uwefed](https://forum.arduino.cc/u/uwefed)\
**Post date:** [September 19, 2023, 8:47pm UTC](https://forum.arduino.cc/t/c-programmierung/1170004/4 "2023-09-19T20:47:40Z")

</div>

& 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

---

<div class="post-metadata">

**Author:** ![michael\_x](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/michael_x/32/628623_2.png) [@michael\_x](https://forum.arduino.cc/u/michael_x)\
**Post date:** [September 20, 2023, 6:42am UTC](https://forum.arduino.cc/t/c-programmierung/1170004/5 "2023-09-20T06:42:14Z")

</div>

> [@combie](#):
>
> Wenn der & Operator Null liefert wird das als LOW gewertet, alles andere als HIGH.

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

(Hier nicht relevant)

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

```

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [September 20, 2023, 8:56am UTC](https://forum.arduino.cc/t/c-programmierung/1170004/6 "2023-09-20T08:56:41Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [March 18, 2024, 8:56am UTC](https://forum.arduino.cc/t/c-programmierung/1170004/7 "2024-03-18T08:56:49Z")

</div>

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