Gast
#5326280
Hallöle, bin gerade etwas überfordert. Möchte gerne diese ganze "if abfragerei" in einer "for" Schleife erledigen.. Muss doch funktionierten oder?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
|
Anzeige
|
Bits tauschen?!
Gast
#5326280
Hallöle, bin gerade etwas überfordert. Möchte gerne diese ganze "if abfragerei" in einer "for" Schleife erledigen.. Muss doch funktionierten oder?
C - Anfänger schrieb: > bin gerade etwas überfordert. > Möchte gerne diese ganze "if abfragerei" in einer "for" Schleife > erledigen.. Was ist eigentlich eine Zählschleife? ;-)
Gast
#5326283
Die Schleife an sich verstehe Ich. Es geht um die Rechnerei. Beitrag "Re: Bits drehen bzw. spiegeln"
Gast
#5326285
Mit den Behinderungen in Bascom könnte man es so machen. If ist nicht notwendig. For I = 0 To 7 K = 7 - I Tmp.i = Half_word.k Next I
Gast
#5326290
Gast
#5326294
Teo D. schrieb: > Beitrag "Re: Bits drehen bzw. spiegeln" > for ( i = 0; i < 8; i++ ) > { > gespiegelt >>= 1; > gespiegelt |= original & 0x80; > original <<= 1; > } Die Lösung ist Prima. Danke! je nach Architektur bietet der GCC dafür "builtins" an, zB für AVR das __builtin_avr_insert_bits:
C - Anfänger schrieb: > Die Lösung ist Prima. Danke! Der Dank geht wohl an ARM-Fan (Gast), Florian (Gast) und Google. 8-) Aber danke für dir Rückmeldung das es funst. ;) wer Platz hat, nimmt eine Lookup-Tabelle:
... und wer keinen hat, der kann das auch in zwei 4-bit Lookups mit entsprechenden Shifts (und dem damit verbundenen Performanceverlust) aufteilen. ... und wer einen ColdFire hat, nimmt BITREV, die ARM-Fraktion RBIT... C - Anfänger schrieb: > Teo D. schrieb: >> Beitrag "Re: Bits drehen bzw. spiegeln" >> for ( i = 0; i < 8; i++ ) >> { >> gespiegelt >>= 1; >> gespiegelt |= original & 0x80; >> original <<= 1; >> } > > Die Lösung ist Prima. Danke! Die Lösung ist m.E. suboptimal. Wenn "orginal" 0 wird, kann man 'fertigshiften' und aufhören. Macht man dennoch weiter, erzeugt man nur noch unnötig Wärme ;)
Gast
#5327303
Hmm. Vergleicht man die beiden Ansätze:
z.B. im Compiler-Explorer (https://godbolt.org/#) und wählt die Option -O3 aus, so zeigt sich sowohl für AVR- als auch ARM-Compiler (die anderen habe ich nicht untersucht), dass durch die Optimierung die erste Lösung deutlich kürzer wird als die Schleife (Stichwort: Loop-Unrolling). Nur so als Anregung... Gruß Herby
Gast
#5327352
Mit der Lookup Tabelle hat man die beste Performance. Kostet aber 256 Bytes RAM.
Gast
#5327354
Stefan U. schrieb: > Kostet aber 256 > Bytes RAM. oder ensprechend ROM Ich werfe mal die in den Raum:
oder auch diese mit lediglich 16 Bytes Lookup-Table.
Quelle: https://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte
Gast
#5327389
Hi Ich finde die Lösung von PeDa eleganter: Beitrag "Re: reihenfolge der bits in einem byte umdrehen" MfG Spess
Gast
#5327394
Hi Mist. Zu spät. MfG Spess
Gast
#5327409
Frank M. schrieb: > Ich werfe mal die in den Raum: [...] Ungünstig, wenn die Zielplattform nur um ein Bit je Befehl schieben kann. > oder auch diese mit lediglich 16 Bytes Lookup-Table. Könnte man pimpen, wenn getrennte Tabellen für High- und Low-Nibble verwendet werden. Possetitjel schrieb: >> oder auch diese mit lediglich 16 Bytes Lookup-Table. > Könnte man pimpen, wenn getrennte Tabellen für > High- und Low-Nibble verwendet werden. Ist bei einer 16 Byte-Tabelle schon geschehen, sonst bräuchte man ja 256 Byte. Vermutlich ist das Compiler-Builtin die sinnvollste Variante. Wenn ein Compiler ohne passendes Builtin benutzt werden soll, dann kann man ja immernoch gcc's builtin disassemblieren...
Gast
#5329968
S. R. schrieb: > Possetitjel schrieb: >>> oder auch diese mit lediglich 16 Bytes Lookup-Table. >> Könnte man pimpen, wenn getrennte Tabellen für >> High- und Low-Nibble verwendet werden. > > Ist bei einer 16 Byte-Tabelle schon geschehen, [...] Missverständnis. Ich sprach davon, eine 16-Byte-Tabelle für das High-Nibble und zusätzlich eine weitere 16-Byte-Tabelle für das Low-Nibble zu verwenden. Das spart die Shifts komplett ein.
Gast
#5330157
Possetitjel schrieb: > Das spart die Shifts komplett ein. Ich finde Deine Idee gut. Führt man sie weiter, könnte man auch 2 * 8 +1*4 Einträge nehmen (2*3Bit, 1*2Bit), 4*4 oder 8*2. Wobei letzteres dann wieder der Ursprungslösung entspricht ;-)
Possetitjel schrieb: > Das spart die Shifts komplett ein. Sind die 4 Bit-Shifts nicht auf den betroffenen 8 Bit-Architekturen beinahe kostenlos (wegen SWAP)? Auf größeren Systemen kann man gleich die volle Tabelle nehmen. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|