System dziesietny, szesnastkowy, binarny
abc
Napisalem sobie kiedys pare funkcji do wlasnie przechodzenia z
dziesietnego -> szesnastkowy
dziesietnego -> binarny
String -> szesnastkowy
szesnastkowy -> String
Mozliwe ze sie komus przyda, a jako ze zawsze chcialem zamiescic cos na 4p postanowilem zamiescic tego GOTOWCA w formie gotowych funkcji :]
{
POMOCNICZE START !! - funkcja potegujaca , pisalem sam nie wiem
czy dziala dobrze w kazdym razie byla potrzebna do systemu
binarnego, a ze nie trzeba ladowac calego math to mysle ze sie przyda
}
function poteN(liczba:int64;do_potegi:integer=2):int64;
begin
case do_potegi of
0:result:=1;
1:result:=liczba;
else
PoteN:=liczba*PoteN(liczba,do_potegi-1);
end;
end;
// POMOCNICZE STOP !!
// BIN START !!
{Obsluguje w miare duze cyfry, mam nadzieje ze wszystko jest jasne - jako zeby funkcja obslugiwala bardzo dlugie lancuchy binarne odwazylem sie zastosowac string jako wejscie mam nadzieje ze strtoint i inttostr wszyscy znaja :P}
function bin2int(binary:string) :int64;
var I,j:integer;wynik:Int64;
begin
wynik:=0;
j:=0;
for i:=length(binary) downto 1 do
begin
wynik:=wynik+((strtoint((binary)[i])*( poten(2,j))));
inc(j);
end;
result:=wynik;
end;
{Tu natomiast w druga strone integer na binary, jako wejscie mozna podac zakres int64 jako wynik string, gdyz takie lancuchy binarne sa b.dlugie :]
}
function int2bin(int:int64):string;
var strtemp:string;
begin
while int>0 do
begin
insert(inttostr(int mod 2),strtemp,1);
int:= int div 2;
end;
result:=(strtemp);
end;
// BIN STOP !!
// START HEX !!
{
To jest w sumie uprostrzenie funkcji gotowej - nie ma co sie glowic :]
w koncu niewazna jest metoda, wazny jest rezultat, a skoro zagladasz do gotowcow to raczej rezultat jest Ci potrzebny (no przynajmniej w 90%)
}
function int2hex(int:integer):string;
begin
result:=inttohex(int,2);
end;
{
Tu tez z wykozystaniem gotowej funkcji, chyba nie ma sporow co do tego ze dziala, a najwazniejsze jest to ze jest w miare szybka
}
function hex2int(hex:string):integer;
begin
result:=strtoint('$'+hex);
end;
{
To jest zmienienie wartosci hex na string - wiadomo ze najlepiej odwracac z funkcji str2hex, ale powinno dzialac tak jak jest w hexedytorach
}
function hex2str(hex:string):string;
var i:integer;s:string;
begin
s:='';
i:=1;
while i<=length(hex) do
begin
s:=s+chr(strtoint('$'+copy(hex,i,2)));
i:=i+2;
end;
result:=s;
end;
{
Funkcja str2hex - hmm mysle ze wynik taki sam jak w hexedytorach POWINIEN byc :]
}
function str2hex(str:string):string;
var i:integer;s:string;
begin
s:='';
for i:=1 to length(str) do
s:=s+inttohex(ord(str[i]),2);
result:=s;
end;
// STOP HEX !!
Jako, ze uznaje gotowce raczej cos co ma byc gotowe, a nie ze ma tlumaczyc dlaczego tak, a dlaczego nie nie zamieszczam dokladnych opisow funkcji (co sie dzieje i dlaczego tak), mam nadzieje ze jak ktos bedzie potrzebowac i skorzysta wystawi jakis komentarz mily, a tutejsi "krytycy" nie "pojada" mnie zbyt mocno :]
Poco tak komplikować? Funkcja potęgi nie jest potrzebna do realizacji konwersji.
Może wkleję rozwiązanie uniwersalne ;) czyli na dowolny system i z powrotem - bin, oct, dec, hex
a także nietypowe systemy np piątkowy czy tez 36-kowy :]
const Digits:String='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
function ValToDig(Val:Byte):Char;
begin
Result:=Digits[Val+1];
end;
function IntToSys(Value:Int64;Sys:Byte):String;
begin
if Value<>0 then
begin
SetLength(Result,0);
while Value>0 do
begin
Insert(ValToDig(Value mod Sys),Result,1);
Value:=Value div Sys;
end;
end
else Result:='0';
end;
function DigToVal(Dig:Char):Byte;
var S,P:PChar;
begin
S:=@Digits[1];
P:=StrScan(S,Dig);
if P<>nil then Result:=Byte(P-S) else Result:=36;
end;
function SysToInt(const Str:String;Sys:Byte):Int64;
var I:Integer;
var D:Byte;
begin
Result:=0;
for I:=1 to Length(Str) do
begin
D:=DigToVal(Str[I]);
if D>=Sys then raise Exception.Create(Str+' is not valid '+IntToStr(Sys)+'-system number');
Result:=Result*Sys+D;
end;
end;
To cos nie chce za bardzo dzialać (mam delphi 7)
Powiedzcie, co dodać do sekcji uses... bo prawdopodobnie czepia się o to...
Dokładnie o in64... :(
mysle ze dla poczatkujacych bardziej przydatne byloby wytlumaczenie przeliczania bin / dec / hex :] Bo tak to poczatkujacy wklepia kod ktorego nie rozumieja ;) no ale jak kto woli ...
do potęgowania w Delphi jest funkcjo Pow lub w ostateczności x^y = exp(y * ln(x))
Co nie zmienia faktu , ze funkcja zwracajaca int64 tez dziala :>
a Pow nie trzeba braz z math ?