Code verstehen?

Hallo,

Was macht der Schnipsel genau? Es ist ein bitweises ODER mit Bitschieberei?
Vom Messchieber kommen die Bits rein.
Ich raff das noch nicht. Wenn jedes ankommende Bit mit 1 ODER verknüpft wird, dann erhalte ich doch immer 1 im Ergebnis. Das wäre doch sinnlos. Kann ja nicht sein. Gleichzeitg wird es um i Stellen verschoben.

Könnte das jemand auseinander klamüsern und bitte erklären?

 if (i<20) {
        value|= 1<<i;
      }

von dem im Überblick

void decode() {

  sign=1;

  value=0;

  for (i=0;i<23;i++) {

    while (digitalRead(clockpin)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed

    while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW

    if (digitalRead(datapin)==LOW) {

      if (i<20) {
        value|= 1<<i;
        }

      if (i==20) {
        sign=-1;
        }
 
    }
  }

Mit 1 << i setzt man immer das i-te Bit. Dieses Konstrukt hat man sehr oft wenn man die Special Function Register des Prozessors (z.B. bei Timern) direkt anspricht.

1 ist 000000001
Die 1 wird dann i mal nach links geschoben und mit dem Oder wird das Bit in value gesetzt.

Hallo,

ähmmm :roll_eyes:

also ausgeschrieben wäre das so?

zuerst wird verschoben mit 1 << i;

das passiert solange i kleiner 20 ist.

Wenn i gleich 5 wäre, macht 1 << i dann aus 0000 0001 … 0010 0000

Richtig?

Jetzt verstehe ich das bitweise ODER noch nicht ganz. Value ist auf 0 gesetzt. Ach’so. Wenn an i. Stelle 0 reinkommt, bleibt die Stelle bei 0 und wenn eine 1 reinkommt wird an i. Stelle eine 1 gesetzt.

Richtig?

Richtig?

ja.

** **if (digitalRead(datapin)==LOW)  // dies ist die eigentliche Umschaltung** **

das [b] if ( i < 20 ) [/b] soll nur verhindern dass zuviele Bits ( 20 … 22 ) gesetzt werden.

Schreibe es erstmal so:
value |= 1<<i; – > value=value | (1<<i);

Wenn i gleich 5 wäre, macht 1 << i dann aus 0000 0001 … 0010 0000

Genau und dies wird mit value bitweise “verodert” , dies hat zur Folge das das entspechende Bit in value gesetzt wird.
Ohne die anderen Bits von value zu verändern

Hallo,

okay Danke Euch. Bin mir sicher das jetzt verstanden zu haben. :) Mit der Kurzschreibweise hab ich so meine Probleme.

Mit der Kurzschreibweise hab ich so meine Probleme.

Nicht nur du, deshalb schreibe es erst immer ausführlich hin wenn ich was nicht verstehe.

Die C-Profis können sich in diese Problematik ihmo nicht mehr reindenken, ein Umsteiger schon :)

rudirabbit:

Mit der Kurzschreibweise hab ich so meine Probleme.

Nicht nur du, deshalb schreibe ich es erst immer ausführlich hin wenn ich was nicht verstehe.

genau das kann ich nicht. Ich erkenne in der Kurzform die eigentliche Langform nicht. Ich frag dann die netten Leute hier. :)

@Doc_Arduino: Zum Thema Bitmanipulation (löschen,setzen,schieben) finde ich diese Seite nicht schlecht. http://www.mikrocontroller.net/articles/Bitmanipulation

Einige Beispiele dort sind in ASM erst leichter zu verstehen als in C. Nein - ich sage nicht das C im Vergleich zu Pascal schlechter zu lesen ist. :zipper_mouth_face: :zipper_mouth_face: */ sarkasmus on C hat sich schließlich durchgesetzt, also muss es besser sein. Ist wie bei VHS und Betamax Video Kassetten damals, war VHS besser ? :P */ sarkasmus off Ich höre jetzt auf C runterzumachen sonst werde ich hier noch gesteinigt. Hängt hauptsächlich von der Lernkurve ab ob man diesen Code mit den Kurzformen etc. gleich versteht. Und sogar ich benutze manche dieser Kurzformen schon automatisch. :blush: