<pre>function BinToInt(BinaerString: String): Integer;
var I: Integer;
BinTaeller: Integer;
Heltal: Integer;
begin
Heltal := 0;
BinTaeller := 1;
for I := 1 to Length(BinaerString) do
begin
if I > 1 then BinTaeller := BinTaeller + BinTaeller;
if BinaerString[Length(BinaerString) - I + 1] = '1' then
Heltal := Heltal + BinTaeller;
end;
Result := Heltal;
end;</pre>Det det sker her er at en løkke kører den Binære værdi igennem og siger: Pladsens værdi (fx 32 16 8 4 2 1) skal fordobles (undtagen første gang da den starter med at være 1). Hvis så at det tegn den er nået til er et 1-tal (Længden - I (1..Længden) + 1 = Højre mod venstre) så bliver pladsens værdi lagt til summen.
<pre>function IntToBin(Heltal: Integer): String;
var HoejesteTal: Extended;
HeltalTemp: Integer;
BinaerString: String;
begin
HeltalTemp := Heltal;
HoejesteTal := Trunc(Log2(HeltalTemp));
HoejesteTal := Power(2, HoejesteTal);
BinaerString := '1';
HeltalTemp := HeltalTemp - Round(HoejesteTal);
repeat
HoejesteTal := HoejesteTal / 2;
if HeltalTemp - HoejesteTal >= 0 then
begin
BinaerString := BinaerString + '1';
HeltalTemp := HeltalTemp - Round(HoejesteTal);
end
else
BinaerString := BinaerString + '0';
until
HoejesteTal = 1;
Result := BinaerString;
end;</pre>1. linie: Indputtet bliver gemt midlertidigt (ikke nødvendigt).
HoejesteTal er et kommatal (extended) der bliver brugt til at finde ud af det højeste af tallene 1, 2, 4, 8, 16, osv som Indputtet kan være i.
For at forstå 2. linie må du lige vide at 1, 2, 4, 8, ... er det samme som 2^0, 2^1, 2^2, 2^3, ...
2. linie: Det første tal skal findes, Trunc() fjerner decimalerne og Log2() gør det modsatte 2^n (fx Log2(8) = 3).
Power(Base, Exp) er det samme som Base^Exp.
3. linie: Her bliver der fundet det første tal fundet ved hjælp af tallet fra linie 2.
Grunden til at vi først skal gå den ene vej og så tilbage igen er at vi skal have fjernet "resten" (fx hvis indputtet er 10 skal tallet være 8, Log2(10) = 3,.. ca 3).
4. linie: Den binære værdi starter med et 1-tal til venstre.
5. linie: Det første Bintal bliver trukket fra. Round() er normalt til at afrunde kommatal, men vi bruger den til at omdanne et kommatal til et heltal.
Repeat/until løkken:
Løkken kører indtil det sidste bintal er kørt igennem.
1. linie: Det første bintal bliver halveret for at få det næste bintal.
2. - 8. linie: En if-sætning ser om det bintal vi er nået til kan være i det vi har tilbage fra indputtet og hvis det kan tilføjes der et 1-tal til den binære værdi og Bintallet bliver trukket fra Indputtet ellers tilføjes der bare et 0.
Emil Melgaard
emil.melgaard@private.dk
- Admin på gruppen Delphi spilprogrammering.
http://www.delphispilprogram.udvikleren.dk