Entwickler-Ecke

Sonstiges (Delphi) - Umwandlung von Integer ins Binärsystem


Skywalker - Do 05.12.02 16:13
Titel: Umwandlung von Integer ins Binärsystem
Hi Leute,

hab mal wieder ne Frage.

Ist es möglich eine Integer-Zahl ins Binärsystem umzuwandeln?

D.h. Integer = 8 Binär = 00001000


Indeterminatus - Do 05.12.02 16:32

aber sicher doch!

ich nehme mal stark an du willst lediglich einen string, der den binär-wert enthält...

das funktioniert nach folgendem schema:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  i    : Integer;
  k   : Byte;
  s   : String;
begin
  s := '';
  i := <die zahl die umgewandelt werden soll>;
  k := 0;
  while (i <> 0) do
  begin
    i := i / 2;
    k := i MOD 2;
    s := chr( k + '0' ) + s;
  end;
  writeln( s );
    // s kann jetzt weiterverwendet werden...
end.


übernehme keine garantie für fehlerfreie funktion dieses quellcodes! er funktioniert nur unter der annahme, dass du POSITIVE integer-werte umwandeln willst, bei negativen müsstest du die noch auf positive mappen, will ich aber jetzt nicht ausführen, um nicht unnötig zu verwirren...


Delete - Do 05.12.02 17:57

Indeterminatus hat folgendes geschrieben:
übernehme keine garantie für fehlerfreie funktion dieses quellcodes

Garantie wird nachgereicht :wink::

Quelltext
1:
i := i / 2;                    

verursacht "Imkompatible Typen 'Integer' und 'Extended'. Richtig wäre:

Quelltext
1:
i := i div 2;                    

und nocheinmal "Imkompatible Typen" in der Zeile

Quelltext
1:
s := chr( k + '0' ) + s;                    

Richtig wäre:

Quelltext
1:
s := chr(k + BYTE('0')) + s                    

(anstelle von "BYTE" kann natürlich auch "ORD" benutzt werden)

Nun, und das "Umwandeln" von negativen Integer-Werten in positive ist mit

Quelltext
1:
i := abs(i);                    

auch recht schnell und ohne Verwirrung erledigt.


Anonymous - Do 05.12.02 20:47

Hab mal selbst entwickelt. Weiss allerdings nicht mehr ob sie Fehlerfrei arbeitet oder nicht:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Konvertiert Dezimalzahl (z.B. 132) in BinString (z.B. '01101011')
// Len gibt an wie lang der BIN-String sein soll (Auffüllung mit 0'en)
function DecToBin(Dec, Len: Byte): String;
begin
  while Dec > 0 do begin
    Result := IntToStr(Dec mod 2) + Result;
    Dec := Dec div 2;
  end;
  while Length(Result) < Len do Result := '0' + Result;
end;


Skywalker - Fr 06.12.02 09:07

Dank Eurer Hilfe läuft es jetzt wunderbar.


Delete - Fr 06.12.02 18:44

MathiasSimmack hat folgendes geschrieben:
Nun, und das "Umwandeln" von negativen Integer-Werten in positive ist mit

Quelltext
1:
i := abs(i);                    

auch recht schnell und ohne Verwirrung erledigt.


Das ist so aber nicht ganz richtig. Zwar funktioniert dann die FDunktion, aber man müßte sich erst mal einigen, wie man negative Zahlen binär darstellt: durch das Zweierkomplement oder sonst wie, dann spielt natürlcih noch dioe Darstellung der Breite eine Rolle. Man kann das höchste Bit als Vorzeichenbit nehmen 10000001b wäre -1d oder aber 129 je nach Definition.

Also ganz so trivial ist das mit den negativen Werten nicht. :wink:


Delete - Fr 06.12.02 21:40

Das ist sicher richtig. Ich habe mich aber nur auf die Aussage
Zitat:
bei negativen müsstest du die noch auf positive mappen, will ich aber jetzt nicht ausführen, um nicht unnötig zu verwirren

bezogen. Das hörte sich in meinen Ohren so an, als wären negative Werte nicht ... hm, sagen wir mal: gewünscht. Und ich glaube, wenn man nur positive Werte zulassen will, ist "abs" doch eigentlich sinnvoll.


Delete - Sa 07.12.02 03:55

Dann ja, aber auch nur dann. Ich wollte damit nur ausdrücken, dass man aucn negative Werte im Binärsystem darstellen kann.