Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Dezimal nach Dual umwandeln

  Alt 2. Aug 2006, 01:57
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat