Forum: Compiler & IDEs Bit weise schieben im Array shift


von Torben W. (toto74)


Lesenswert?

Hallo an alle die das hier lesen!
Ich habe folgendes Problem
Ich möchte in ein uint8_t array[12]
bitweise schieben geht aber nur für das erste Byte alle anderen sind 0.

array[0] |= (1<<0...7) geht
array[0] |= (1<<8....) geht nicht mehr

AVR GCC
attiny2313

Gruß Torben

von ferdi (Gast)


Lesenswert?

du kannst nicht über das byte hinausschieben
aber probier doch mal folgenden code

unsigned char temp;
temp = (1 << x);
array[0] |= (unsigned char)temp;
array[1] |= ((unsigned char)temp >> 8);

von ferdi (Gast)


Lesenswert?

edit: ich meine natürlich unsigned int temp;
sry

von ferdi (Gast)


Lesenswert?

Oder:

unsigned char x = [hier willst du eine 1];

array[x/8] |= (1 << (x%8));

von Torben W. (toto74)


Lesenswert?

Ich wollte das Array eigentlich nicht hochzählen da ich einen Bit 
counter
habe und müßte dann die bytes noch zählen und die bits runter teilen.

von Karl H. (kbuchegg)


Lesenswert?

Wo ist das niederwertigste Bit?

Annahme: Bit 0 in array[0] ist das niederwertigste Bit
         Bit 7 in array[11] ist das höchstwertigste Bit


Um 1 Bit über 12 Bytes hinweg um jeweils 1 Stelle zu schieben
1
  for( i = 11; i > 0; --i ) {
2
    tmp = array[i-1] & 0x80;
3
    array[i] = array[i] << 1;
4
    if( tmp )
5
      array[i] |= 0x01;
6
  }
7
  array[0] = array[0] << 1;

Einer der wenigen Dinge, die ein heisser Kandidat für
Inline Assembler sind, da man dort durch Einbeziehung
des Prozessor Carry Flags, die ganze 'Übertragsberücksichtigung'
ins nächste Byte einfacher hinkriegt.

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.