嗯,今天阳光明媚,空气清新,心情愉快,还不忙。正好有人说到进制转换,就试着做了一下。
此处省略一千字的废话。。。。
先上图:
下面直接上代码,希望大家能看明白。
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const Convert: array[0..255] of Integer = ( -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,-1,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ); Convert2: array[0..33] of AnsiChar = ( '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f', 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 'w','x'); function IntToHEX34(const V: Int64; const Digits: Integer = -1): string; const CSTR = '0000000000000000'; var P, P1: PAnsiChar; I: Int64; NewLen: Integer; begin GetMem(P, 16); Move(CSTR, P^, 16); P1 := P + 16 - 1; I := V; while True do begin P1^ := Convert2[I mod 34]; I := I div 34; if I = 0 then Break else Dec(P1); end; NewLen := 16 - (P1 - P); if NewLen > Digits then SetString(Result, P1, NewLen) else begin P1 := P + 16 - Digits; SetString(Result, P1, Digits); end; end; function HEX34ToInt(const S: string; const Default: Int64): Int64; var I: Integer; v: Int64; begin Result := 0; for I := 1 to length(s) do begin V := Convert[ord(s[i])]; if V < 0 then begin Result := Default; Exit; end; result := (result * 34) + V; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := IntToHEX34(StrToInt64Def(Edit1.Text, 0)); end; procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Text := IntToStr(HEX34ToInt(Edit2.Text, 0)); end; end.
34进制,不好优化。要是32进制,除法的地方和乘法地方,应该可以换成移位操作。