[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]
> I made a Program in Turbo-Pascal that rotates the bits in one Byte so I can
> encrypt/decrypt a File, however the routine is slow. I then made the same
> Program in turbo-C using _RotLeft and _RotRight, the speed of execution was
> Really faster than Turbo-Pascal. Does anybody know of a way to rotate the
> bits of one Byte in turbo-Pascal and FAST !!!!
Since 80xxx CPUs have bit rotate instructions (ROL, ROR), it would
be a shame to use some clumsy HLL Construct. BTW, I'm sure _RotLeft and
_RotRight use rotate instructions too, possibly insert them Inline. If
you are using TP 6.0+, try something like this:
{ to rotate left }
Function RotLeft(B, Count: Byte): Byte; Assembler;
Asm
mov al, B
mov cl, Count
rol al, cl
end;
{ to rotate right }
Function RotRight(B, Count: Byte): Byte; Assembler;
Asm
mov al, B
mov cl, Count
ror al, cl
end;
Of course, if you need to do this in only a few places it would
be better not to define Functions, but insert Asm blocks in your code
directly.
The fastest Pascal way to rotate Byte would be something like
this:
Function RotLeft(B, Count: Byte): Byte;
Var
W : Word;
A : Array[0..1] of Byte Absolute W;
begin
A[0] := B;
A[1] := B;
W := W shl Count;
RotLeft := A[1];
end;
To rotate right With this method, you would shift right and
return A[0]. I would like to think this is as fast as it gets in TP
without assembly, but one can never be sure <g>. Anyway, I recommend
the assembly solution over this one, it is faster and more elegant.
[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]