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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren