Registriert seit: 21. Jun 2007
Ort: Dresden
32 Beiträge
Delphi 7 Professional
|
Bit Reverse Algorithmus
21. Jun 2017, 15:37
Da ich gerade mit FFT arbeite brauche ich eine Funktion, die schnell die Bitumkehrung eines Wertes variabler Bitbreite zurückgibt.
von MSB->LSB zu LSB->MSB
zur Zeit habe ich folgende Umsetzungen:
Variante 1:
Delphi-Quellcode:
function BitRev(inBit {eax}: Cardinal; BitCount {edx}: integer): Cardinal;
asm
xor ecx, ecx // ecx := 0
test edx, edx // ist edx = 0?
jz @Ende // wenn ja springe zu Ende
@Loop:
shr eax, 1 // eax nach rechts schieben -> unterstes Bit ins Carry-Flag
rcl ecx, 1 // ecx nach links über Carry rotieren
dec edx // dec(edx)
jnz @Loop // wenn edx <> 0 --> springe zu Loop
@Ende:
end;
Variante 2:
Delphi-Quellcode:
function BitRev(inBit {eax}: Cardinal; BitCount {edx}: integer): Cardinal;
asm
mov ecx, edx
lea edx, [eax * 2]
shr eax, 1
and edx, $AAAAAAAA
and eax, $55555555
or eax, edx
lea edx, [eax * 4]
shr eax, 2
and edx, $CCCCCCCC
and eax, $33333333
or eax, edx
lea edx, [eax * 8]
shl edx, 1
shr eax, 4
and edx, $F0F0F0F0
and eax, $0F0F0F0F
or eax, edx
bswap eax
rol eax, cl
end;
habt ihr vielleicht einen noch schnelleren Ansatz ohne LookUpTable?
der Mischka
|
|
Zitat
|