Bitwise OR und BitShift - Eine einzelne LED setzen

Hallo Community,
ich sitze gerade vor einer Funktion, mit der ich einzelne LEDs anschalten kann, die ich vor ein paar Monaten geschrieben habe und habe vergessen diese zu kommentieren
und kann dummerweise diese nicht mehr nachvollziehen :S.
Ich programmiere derzeit an einer 8x8 LED Matrix und muss dies unbedingt wissen.
Hier erstmal die Funktion:

void setLED(byte x, byte y){
  Matrix[x] = Matrix[x]|128<<y;
}

Wenn ich nun die Funktion aufrufe in der loop, z.B:

void loop(){
  setLED(5,5);
  LedsAnzeigen(); //Ausgabe aller LEDS
}

dann leuchtet auch die LED an der Stelle 5,5 der Matrix, aber ich kann es nicht ganz nachvollziehen.
Wenn ich mir die Tutorials richtig durchgelesen habe, dann verstehe ich es folgendermaßen:

Matrix[x] stellt in diesem sinne meine X-Koordinate dar und die Variable y die Y-Koordinate.

Nehmen wir nun die beiden Zahlen 5,5 und vergleichen sie mit dem | OR
5 = 00000101
128 = 10000000

10000101 = 133,
dann werden durch den nächsten Operator "<<" die Bits von links nach rechts verschoben und das ganze um 5 stellen, also:
00000100 = 4, aber das wäre ja in einem Koordinatenkreuz dann 5,2 oder habe ich hier einen Denkfehler?
Ich hoffe ihr könnt mir helfen.
MfG: idl0r

idl0r:
Nehmen wir nun die beiden Zahlen 5,5 und vergleichen sie mit dem | OR
5 = 00000101
128 = 10000000

10000101 = 133,
dann werden durch den nächsten Operator "<<" die Bits von links nach rechts verschoben und das ganze um 5 stellen, also:
00000100 = 4, aber das wäre ja in einem Koordinatenkreuz dann 5,2 oder habe ich hier einen Denkfehler?

<< schiebt die Bits nach LINKS.
10000101 << 5 = 10100000

Was für einen Typ hat das Array Matrix?
Wenn es ein Int ist (16 bit), dann sieht das Ganze so aus:
5 = 00000000 00000101
128 = 00000000 10000000

00000000 10000101 = 133,

00000000 10000101 << 5 = 00010000 10100000 = 4256

Vielleicht ist das eine verkettung von type promotion und versteckten casts. Ist mir im moment zu schwierig.

Ich haette jedenfalls folgendes geschrieben:

Matrix[x] |= (1<<y);

oder

Matrix[x] |= _BV(y);

Und nebenbei bemerkt waere es sehr zu empfehlen bei solchen verkettungen klammern zu setzen. Die operator praezedenz merkt man sich kaum - und im zweifelsfall falsch.

Hallo,
ersteinmal danke für die Hilfe. Das Array ist vom typen byte und das mit den Klammern werde ich aufjedenfall hinzufügen,
aber wie funktioniert denn jetzt genau meine Methode?
Eine Möglichkeit wäre zwar auf die Ausweichmethoden umzusteigen, aber dann bleib ich ja genauso "schlau" wie vorher ;).

Um die uhrzeit kann ich das jedenfalls nicht erklaeren. Nach etwas forschung bezeuglich operator preaz... sollte das aequivalent sein:

matrix[x] = matrix[x] | (128 << y);

Warum das bei Dir funktioniert weiss ich nicht.

Wenn ich das hier compiliere, dann ergibt sich folgendes:

matrix is von type byte. (128 << 5) ist groesser als 255. Da das mit einem byte zusammen ge-OR-t wird und wieder in ein 'byte' geschrieben wird, bleibt 0 ueber. Wenn aus irgendwelchen unerfindlichen gruenden das high-byte uebrig bliebe, dann und nur dann koennte da wieder eine 5 bei rauskommen. Fuer das was du bezweckst ist dein code jedenfalls ausgesprochen 'ungewoehnlich' oder schlimmeres.

Ist matrix vom typ 'byte' kommt immer 0 raus, ist es vom typ int, dann korrekterweise 4096 (mit einer 1 an der 5-ten stelle des high-bytes).

Hallo,
oh man tut mir leid, die shift operatoren sind >> so rum, nicht <<, sorry :S. Bin bisschen neben der Spur.
mfg

Mit (128 >> y) und 5=y sollte das 3-te bit an sein. 128/(2^5) = 4 = (1<<2).

Das problem liegt in zeile 42.