Přehození bitů proměné v C

Dobrý den,

rád bych vás poprosil o pomoc, v proměné kde je 8bitů bych je potřeboval prohodit takto
původní usporádání bitů:
76543210

nové uspořádání by mělo být takovéto:
45670123

Děkuji za pomoc nebo návod.

že by takhle?
char puvodni, novy;
novy = 0;
if (puvodni & 0x10000000)
novy = 0x00010000;
if (puvodni & 0x01000000)
novy |= 0x00100000;
if (puvodni & 0x00100000)
novy |= 0x01000000;
if (puvodni & 0x00010000)
novy |= 0x10000000;
if (puvodni & 0x00001000)
novy |= 0x00000001;
if (puvodni & 0x00000100)
novy |= 0x00000010;
if (puvodni & 0x00000010)
novy |= 0x00000100;
if (puvodni & 0x00000001)
novy |= 0x00001000;

Ahoj, diky za typ, bohužel se v C pro AVR nevyznam, v ASM pro PIC by to bylo podobne, jen bych rovnou ten bit nacetl a pak ulozil na potrebnou pozici.

Jinak tvuj kod jsem upravil aby prekladaci bylo jasne, ze jde o zapis bitu. tedy 0b00000000 na misto 0x00000000

Na to je asm instrukce SWAP

Nevím v jakém IDE pracuješ, ale každé umí přepnout do asm a zpět, nebo vložit inline

v AVR studio je to myslím

char c; asm("swap", c)

nebo nějak tak , když tak mně někdo opravte :slight_smile:

Nojo, swap sice prohazuje, ale dolní 4 bity za horní, a tohle ten problém neřeší :slight_smile:

V ASM by to zabralo 17 instrukcí :

; R16=76543210 swap R16 ; R16=32107654 lsl R16 ; R16=2107654x, C=3 ror R17 ; R17=3xxxxxxx rol R16 ; R16=107654xx, C=2 ror R17 ; R17=23xxxxxx rol R16 ; R16=07654xxx, C=1 ror R17 ; R17=123xxxxx rol R16 ; R16=7654xxxx, C=0 ror R17 ; R17=0123xxxx rol R16 ; R16=654xxxxx, C=7 ror R17 ; R17=70123xxx rol R16 ; R16=54xxxxxx, C=6 ror R17 ; R17=670123xx rol R16 ; R16=4xxxxxxx, C=5 ror R17 ; R17=5670123x rol R16 ; R16=xxxxxxxxx, C=4 ror R17 ; R17=45670123
celkem 17 taktů mcu.

nebo

; R16=76543210 clr R17 sbrc R16, 0 sbr R17, (1<<3) sbrc R16, 1 sbr R17, (1<<2) sbrc R16, 2 sbr R17, (1<<1) sbrc R16, 3 sbr R17, (1<<0) sbrc R16, 4 sbr R17, (1<<7) sbrc R16, 5 sbr R17, (1<<6) sbrc R16, 6 sbr R17, (1<<5) sbrc R16, 7 sbr R17, (1<<4) ; R17=45670123
celkem 9-17 taktů mcu v závislosti na vstupní hodnotě.

nebo kratší verze - 16 instrukcí:

; R16=76543210 bst R16, 0 bld R17, 3 bst R16, 1 bld R17, 2 bst R16, 2 bld R17, 1 bst R16, 3 bld R17, 0 bst R16, 4 bld R17, 7 bst R16, 5 bld R17, 6 bst R16, 6 bld R17, 5 bst R16, 7 bld R17, 4 ; R17=45670123
celkem 16 taktů mcu.

Ve všech případech je vstup v R16, výstup v R17.