Forum: Mikrocontroller und Digitale Elektronik bit array to long


von mr.T (Gast)


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

von Dr. Sommer (Gast)


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.

von mr.T (Gast)


Lesenswert?

Hallo und Danke,
so ähnlich hab ich mir das auch vorgestellt :). Kann es leider noch 
nicht testen...

nur was wird genau in dem andere Quellecode gemacht ?

von Dr. Sommer (Gast)


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.

von Fabian O. (xfr)


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.

: Bearbeitet durch User
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.