bit array to long

Gast #3396077
Lesenswert?
• ▲
▼
Hallo,
es geht darum aus den Bits (LSB 0) die in einem Array sind ein Zahl zu 
bauen. Ich hab was ähnliches mit (24) Bits gefunden.

Voraussetzung ist das die Bits in richtiger Reihenfolge im Array 
liegen...
1
 for(i=0; i<24; i++)
2
   { erg |= ((int32_t)(((buffer[i]&(1<<DATA))>>DATA))<<(i+8)); // DATA ist 4
3
   }
4
   return ~erg;

das Grundkonzept ist mir klar, was mir nicht klar ist, ist dieser teil.
1
((buffer[i]&(1<<DATA))>>DATA) // DATA ist  4

Das Arry sieht ja so aus [0,1,1,0,1,0,0....

grüße T
Gast #3396082
Lesenswert?
• ▲
▼
Das ist irgendwie komisch und unnötig kompliziert.
1
uint8_t bitarray[32];
2
uint32_t result = 0;
3
for (int_fast8_t i = 0; i < 32; i++) {
4
  result = (result << 1) | bitarray[31-i];
5
}
Läuft dann auch mehr oder weniger effizient auf einer CPU ohne 
Barrelshifter.
Gast #3396421
Lesenswert?
• ▲
▼
mr.T schrieb:
> nur was wird genau in dem andere Quellecode gemacht ?
Irgendwas komisches, die obersten 4 bits vom eingabearray gelöscht, und 
dann ab dem 8. bit reingeshiftet, und am ende das ergebnis invertiert - 
ein einfaches zusammensetzen ist das nicht.
#3396568
Lesenswert?
• ▲
▼
mr.T schrieb:
> das Grundkonzept ist mir klar, was mir nicht klar ist, ist dieser
> teil.
1
((buffer[i]&(1<<DATA))>>DATA) // DATA ist  4
>
> Das Arry sieht ja so aus [0,1,1,0,1,0,0....

Es wird Bit Nummer 4 des jeweiligen Array-Bytes abgefragt und an Stelle 
0 geschoben. Wenn Bit 4 in dem Byte gesetzt ist, ist das Ergebnis 1. 
Wenn Bit 4 nicht gesetzt ist, ist das Ergebnis 0.

Man könnte es auch so schreiben:
1
((buffer[i] & (1<<DATA)) ? 1 : 0)

Oder:
1
(!!(buffer[i] & (1<<DATA)))

Oder mit einem if:
1
if (buffer[i] & (1<<DATA))

Das Ergebnis wird dann an Stelle 8 bis 31 in der Variable erg 
gespeichert und wird am Schluss nochmal invertiert. An allen Stellen, an 
denen im ursprünglichen Array-Byte Bit 4 gesetzt war, steht also im 
"Ergebnisbit" eine 0, sonst 1.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.