Forum: Mikrocontroller und Digitale Elektronik Port / Schiebeoperation was bedeutet das bitte?


von Matze (Gast)


Lesenswert?

Hallo erfahrene Experten,

könnt ihr mir bitte erklären was dieses Funktion bewirkt?

uint8_t pins = (0x0F << PB0) |  (1<<PB2) |  (1<< PB4);



Ich verstehe das so weit, dass die pins mit einem vorzeichenlosen int 
deklariert werden. Soweit alles ok.

Was bedeutet den der erste Klammerausdruck bitte?  00001111  was wird 
dann mit PB0 ?

und was bedeutet | das hier? oder? wie wirkt sich dieses oder bitte aus?

(1<<PB2) ist mir im einzelnen schon klar,  PB2 wird auf 1 gesetzt, also 
für sich gesehen so 0000 0100

PB4  0001 0000

was ergibt das dann mit der ersten Klammer in der Summe?

so einen Ausdruck habe ich noch nie gesehen.

Ich wäre Euch über Antworten sehr dankbar.

Viele Grüße, MAtthias.

von Karl H. (kbuchegg)


Lesenswert?

Matze schrieb:

> Was bedeutet den der erste Klammerausdruck bitte?  00001111  was wird
> dann mit PB0 ?

 .... nach links geschoben.

  a << b

a wird um b binäre Stellen nach links verschoben.


> und was bedeutet | das hier? oder?

Ja.

>  wie wirkt sich dieses oder bitte aus?

  Die einzelnen Bits werden miteinander verodert.

      A  B   Ergebnis
     -----------------
      0  0     0
      1  0     1
      0  1     1
      1  1     1

Nur halt auf die einzelnen Bits. Stell dir deine Zahlen als 8 Bits vor

die schreibst du untereinander

         01010101
  oder   00101100
      -----------
           ?

und jetzt wendest du für jede Spalte (=jedes Bit) die Oder-Vorschrift 
an. Rechts beginnend: 1 oder 0 ergibt 1
                  0 oder 0 ergibt 0
                  1 oder 1 ergibt 1
                  0 oder 1 ergibt 1
                  ....

Das Ergebnis


         01010101
  oder   00101100
      -----------
         01111101

(Im Ergbnis ist genau dort eine 1, wo entweder in der ersten Zahl oder 
in der zweiten Zahl eine 1 war).

>
> (1<<PB2) ist mir im einzelnen schon klar,  PB2 wird auf 1 gesetzt,

Nö.
PB1   ist  1

Für PB0, PB1, PB2 ... existieren #define-ments

#define PB0   0
#define PB1   1
#define PB2   2

also reine Textersetzungen. Überall dort wo du PB2 schreibst, ersetzt 
der Compiler (eigentlich der Präprozessor) diesen Text "PB2" durch den 
Text "2"

Nachdem er das gemacht hat, wird aus

     1 << PB2
das hier
     1 << 2

> also
> für sich gesehen so 0000 0100

Stimmt. Aber warum ist das so?
(Das frag ich mich, weil du weiter oben nicht wusstest was << macht)

> PB4  0001 0000

Nein

> was ergibt das dann mit der ersten Klammer in der Summe?

rechne dir die Einzelteile aus, schreib sie untereinander und odere die 
Bits zusammen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.