home *** CD-ROM | disk | FTP | other *** search
- Turbo Pascal Optimization Contest # 51.
-
- No tangible prizes, just some bragging rights, and a brain workout.
-
- Assignment: Write conversion routines similar to VAL and STR that can
- handle a radix (base) of any number. For example, below is
- a straight Pascal Procedure to convert a String of any base
- to a LongInt. Can you improve the speed of this routine,
- and Write a correspondingly fast routine to convert from a
- LongInt to a String of any base?
-
- Rules: No rules. BAsm is allowed, as long as the Functions are
- readily Compilable without the use of TAsm.
-
- Judging: Code will be tested on a 386-40 on March 10th, by being
- placed into a loop With no output, like this:
-
- StartTiming;
- For Loop := 1 to 10000000 { ten million } do
- { Execute the test, no output }
- WriteLn(StopTiming);
-
- Ready, set, code! Here's the sample...
-
- (* This Function converts an ASCIIZ String S in base Radix to LongInt I
- * With no verification of radix validity. The calling Programmer is
- * responsible For insuring that the radix range is 2 through 36. The
- * calling Programmer is also responsible For insuring that the passed
- * String contains only valid digits in the specified Radix. No checking
- * is done on the individual digits of a given String. For bases 11-36
- * the letters 'A'-'Z' represent the corresponding values.
- *)
-
- Procedure StrtoLong(Var I : LongInt; S : PChar; Radix : Integer);
- begin
- I := 0;
- While S[0] <> #0 do
- begin
- Case S[0] of '0'..'9' : I := I * Radix + (ord(S[0])-48);
- 'A'..'Z' : I := I * Radix + (ord(S[0])-54);
- 'a'..'z' : I := I * Radix + (ord(S[0])-86);
- Inc(s);
- end;
- end;
-