OK, eigentlich trivial das Thema. Nehmen wir die Zahl 175 als Beispiel. Mit Papier und Bleistift würde man es so machen:
Code:
175
175 : 2 = 87 Rest 1
87 : 2 = 43 Rest 1
43 : 2 = 21 Rest 1
21 : 2 = 10 Rest 1
10 : 2 = 5 Rest 0
5 : 2 = 2 Rest 1
2 : 2 = 1 Rest 0
1 : 2 = 0 Rest 1
10101111
Dieser Algorithmus nach Delphi umgesetzt könnte so aussehen:
Delphi-Quellcode:
function dec2bin1(Value: Cardinal): String;
const
s = '%d : %d = %d Rest %d';
var
Rest: Cardinal;
IntPart: Cardinal;
Temp: Cardinal;
begin
Temp := Value;
IntPart := Value;
while IntPart > 0 do
begin
Rest := IntPart mod 2; // Divisionsrest
IntPart := Temp div 2; // ganzahlige Division
writeln(Format(s, [Temp, 2, IntPart, rest]));
Temp := IntPart;
result := IntToStr(rest) + result;
Sleep(175);
end;
end;
(Das Writeln und das Sleep dienen nur zur Veranschaulichung.) Dies entspricht so ziemlich einer eins zu eins Umsetzung, wie man es auch im Kopf machen würden.
Jetzt kann man das Ganze aber noch, sagen wir mal, rein mathematisch machen:
Delphi-Quellcode:
function dec2bin2(Int: Integer): String;
var
i : Integer;
begin
Result := '';
for i := 7 downto 0 do
Result := Result + IntToStr((Int shr i) and 1);
end;
Doch da habe ich ein Verständnis Problem:
Warum läuft die Schleife von 7 runter auf 0?
Und was macht das
((Int shr i) and 1?
Was der Operator shr macht ist mir bekannt:
Aus 101 wird 010, wenn man das um eins nach rechts verschiebt. Aber warum macht man das und warum die logische Verknüpfung mit
and 1?
Desweiteren: nehmen wir die Zahl 1234567890 als Beispiel. dec2bin1 liefert 1001001100101100000001011010010. dec2bin2 aber nur 11010010. Also die ersten acht Stellen bzw. so viele Stellen, wie die Schleife durchlaufen wird.