Hallo
ich hab da ne frage und es wäre super wenn mir jemand weiterhelfen
könnte.
wie kehrt man ein Register um? (LSB 1 wid MSB 2 und MSB 1 wird LSB 2)
z.B 1101 0010
0100 1011
(ich meine nicht invertieren!!!!)
Danke für jede Hilfe
mgf
Gast
#2890140
Das wird hier immer wieder mal gefragt. Suche mal hier im Forum "Bit reihenfolge umdrehen"
Gast
#2890169
Cortex M kann das mit eingebauten Befehl.
Bitweise nach links schieben und über Carry nach rechts in das Zielregister schieben.
Gast
#2890268
Soll es zügig gehen und stehen 256 Byte Festspeicher dafür zur Verfügung, bietet sich ein Table-Lookup in eine Tabelle mit "rückwärts bestückten" Bits an.
In avr-gcc gibt's dafür ein Built-in, siehe am Ende der Seite: http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/AVR-Built_002din-Functions.html
1 | |
2 | |
3 | |
4 | |
Wird compiliert zu:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Gast
#2890336
Hallo, da es bei fast allen Prozessoren keinen Befehl dafür gibt, braucht man 3 Register , 2 zum Schieben und 1 zum Zählen. Die Schleife erfordert dann 16 Schiebe- und 8 Zähl/Sprungbefehle, kürzer gehts nicht. Man kann natürlich die 16 Schiebebefehle hintereinanderschreiben und spart damit die Sprünge, nur wird dadurch das Programm länger. Gruss Reinhard
Gast
#2890371
Hi >da es bei fast allen Prozessoren keinen Befehl dafür gibt, braucht man 3 >Register , 2 zum Schieben und 1 zum Zählen. Nö. Ein zusätzliches Register reicht. Das Prinzip stammt hier aus dem Forum. Allerdings weiß ich nicht mehr genau von wem (PeDa,KHB oder ....)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
MfG Spess
Dieses Prinzip gibts auch in breit. Aufwand log(#Bits): http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious Prozessoren mit Barrelshifter tun sich da leichter. Die formal (in C) kürzeste 8-Bit Variante ist wohl: b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023; Geht zwar auch auf AVR (bei GCC), aber...
Klaus 2m5 schrieb: > Bitweise nach links schieben und über Carry nach rechts in das > Zielregister schieben. So sieht das aus! Und zwar gegenseitig. Dann ist kein weiteres Register notwendig. Also so: ,---------v [<<<<<<<<][>>>>>>>>] ^---------' [01234567][89ABCDEF] [1234567F][089ABCDE] [234567FE][1089ABCD] [34567FED][21089ABC] [4567FEDC][321089AB] [567FEDCB][4321089A] [67FEDCBA][54321089] [7FEDCBA9][65432108] [FEDCBA98][76543210] Gruß Jobst
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.