Operacje Bitowe w Delphi

0

Przygotowałem te procedury lata temu jeszcze pod Delphi2 działają ale zapewne można je
jeszcze optymizować czasowo jeśli ktoś ma lepszy odpowiednik proszę o gotowca...
przy bardzo wielokrotnym wywołaniu liczy się każdy cykl

////////////////////////////////////////////////////////////////////////////////
//Procedura odwraca stan okreslonego bitu w operandzie (Dana) numer bitu
//podajemy w operandzie (Bit) bity numerowane sa od 0 tz. zero = najmlodszy bit!
function NotBit(Dana: byte; Bit: integer):byte;
asm
MOV AL,1
MOV ECX,Bit
ROL AL,CL
MOV CL,Dana
XOR CL,AL
MOV Result,CL
end;
function NotBit(Dana: word; Bit: integer):word;
asm
MOV AX,1
MOV ECX,Bit
ROL AX,CL
MOV CX,Dana
XOR CX,AX
MOV Result,CX
end;
function NotBit(Dana: dword; Bit: integer):dword;
asm
MOV EAX,1
MOV ECX,Bit
ROL EAX,CL
MOV ECX,Dana
XOR ECX,EAX
MOV Result,ECX
end;
////////////////////////////////////////////////////////////////////////////////
//Procedura odczytuje stan okreslonego bitu w operandzie (Dana) numer bitu
//podajemy w operandzie (Bit) bity numerowane sa od 0 tz. zero = najmlodszy bit!
function GetBit(Dana: byte; Bit: integer):boolean;
asm
BT AX,DX
JC @set
MOV Result,False
JMP @fin
@set: MOV Result,True
@fin:
end;
function GetBit(Dana: word; Bit: integer):boolean;
asm
BT AX,DX
JC @set
MOV Result,False
JMP @fin
@set: MOV Result,True
@fin:
end;
function GetBit(Dana: dword; Bit: integer):boolean;
asm
BT EAX,DX
JC @set
MOV Result,False
JMP @fin
@set: MOV Result,True
@fin:
end;
////////////////////////////////////////////////////////////////////////////////

1

Pascala dawno na oczy nie widziałem, ale jesteś pewien, że specjalnie napisane funkcje i ich wywołanie będą szybsze niż wbudowane operatory, nie mówiąc już o czytelności? W asm bym pisał jak już to wnętrze naprawdę ciasnej pętli, a nie funkcje do pojedynczych operacji bitowych.

0

operacje bitowe same w sobie są juz bardzo szybkie, wiecej czasu tracisz na wywołanie procedury... funkcje jak już powinny być typu inline.

1 użytkowników online, w tym zalogowanych: 0, gości: 1