Einzelnen Beitrag anzeigen

derMischka

Registriert seit: 21. Jun 2007
Ort: Dresden
32 Beiträge
 
Delphi 7 Professional
 
#1

Bit Reverse Algorithmus

  Alt 21. Jun 2017, 14: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
  Mit Zitat antworten Zitat