Forum: Compiler & IDEs Bitmaskierung funktioniert nicht


von Doran S. (utzer)


Lesenswert?

Hallo,

ich bin gerade echt am Verzweifeln und hoffe, man kann mir hier helfen.

Ich programmieren gerade ein Programm für einen ATTiny2313.

In dem Programm habe ich ein Array und eine Variable, in der ein zuvor 
berechneter Wert gespeichert ist:
1
char data[24];
2
uint16_t Teiler;
3
4
...
5
6
Teiler = 0b101111111110111;      //Ein möglicher Wert zur Verdeutlichung

Der Wert von 'Teiler' soll nun in das Array, aber die Bits müssen 
"gespiegelt" werden, also so:
1
data[0] = (Teiler & 1);
2
data[1] = (Teiler & 2);
3
data[2] = (Teiler & 4);
4
data[3] = (Teiler & 8);
5
data[4] = (Teiler & 16);
6
data[5] = (Teiler & 32);
7
data[6] = (Teiler & 64);
8
data[7] = (Teiler & 128);
9
data[8] = (Teiler & 256);
10
data[9] = (Teiler & 512);
11
data[10] = (Teiler & 1024);
12
data[11] = (Teiler & 2048);
13
data[12] = (Teiler & 4096);
14
data[13] = (Teiler & 8192);

Die restlichen Elemente des Array werden später befüllt.

Das Problem:
Bis data[7] klappt alles, danach werden alle Elemente des Arrays 0
Woran liegt das, was mache ich falsch?

Gruß
und Danke im Voraus
Doran

von Helfer (Gast)


Lesenswert?

die Schubladen deines Arrays sind nur 8 Bit breit.

Mach es uint16_t, dann klappt es.

von 900ss (900ss)


Lesenswert?

Überlege dir mal, wieviele Bits du brauchst um das Ergebnis von
Teiler & 256 zu speichern und wieviel Bits du zur Verfügung hast in 
einem Arrayelement.

von Doran S. (utzer)


Lesenswert?

Hallo,

danke für die Antworten.
Ich wollte eig. was ganz anderes haben, nämlich so:
1
for(uint8_t i = 0; i != 15; i++)
2
        data[i] = ((Teiler>>i) & 1);

Gruß
Doran

von Uwe (de0508)


Lesenswert?

Hallo Doran,

ein kleiner Tipp, vielleicht ist es Dir nicht bewusst, deine Schleife 
läuft nur bis 14.

Also Besser so etwas verwenden.
1
for(uint8_t i = 0; i < 16; i++)
2
   data[i] = ((Teiler>>i) & 1);


Doran S. schrieb:
> Hallo,
>
> danke für die Antworten.
> Ich wollte eig. was ganz anderes haben, nämlich so:
>
>
1
for(uint8_t i = 0; i != 15; i++)
2
>         data[i] = ((Teiler>>i) & 1);
>
> Gruß
> Doran

von Doran S. (utzer)


Lesenswert?

Uwe S. schrieb:
> ein kleiner Tipp, vielleicht ist es Dir nicht bewusst, deine Schleife
> läuft nur bis 14.

Danke, aber das ist so gewollt! Die Schleife muss genau 14 mal 
durchlaufen.

Doran

von Stefan E. (sternst)


Lesenswert?

Doran S. schrieb:
> Danke, aber das ist so gewollt! Die Schleife muss genau 14 mal
> durchlaufen.

Dann ist sie aber trotzdem falsch, denn deine wird 15 mal (0-14) 
durchlaufen.

von Doran S. (utzer)


Lesenswert?

Hallo,

es werden ja die Elemente des Arrays gefüllt, also:

data[0] = ...
data[1] = ...
...
data[12] = ...
data[13] = ...

und data[13] soll das letzte Element sein, das zugewiesen wird, also 
muss die Schleife genau 14 mal (0...13) durchlaufen.

Wäre das dann so erfüllt:
1
for(uint8_t i = 0; i < 14; i++)
2
      data[i] = ((Teiler>>i) & 1);
?

Gruß und Danke für die Tipps,
Doran

von Stefan E. (sternst)


Lesenswert?

Doran S. schrieb:
> Wäre das dann so erfüllt:

Ja.

von Doran S. (utzer)


Lesenswert?

ok, cool, Danke!
Doran

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.