Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Binär zu Dezimal Umwandler


-Nala- - Sa 16.02.08 17:22
Titel: Binär zu Dezimal Umwandler
Hallo!
Ich habe eine Frage !
Für die Schule muss ich ein Programm schreiben, indem man Binärzahlen ins Dezimalsystem (und umgekehrt) rechnen kann. Ich habe allerdings keine Ahnung wie man das in die Unit eingibt ???

Könnt ihr mir vielleicht helfen ?

THX


LorenzS - Sa 16.02.08 17:51

erster


Hidden - Sa 16.02.08 18:04

Hi,

user profile iconLorenzS hat folgendes geschrieben:
versuch mal mit IntToStr und StrToInt.

die frage ist was ist für dich eine Binäre Zahl? Int64/Longword/Integer/Word/Byte oder ein String aus den Zeichen '0' und '1'?

Das hilft doch nicht, gefragt ist nicht nach einer Umwandlung in string, sondern in Binär!

Mit Suche in der Entwickler-Ecke BIN?RCODE hast du dich schon beschäftigt?
Dann ist die Binärzahl gleich der Summe der Bitwerte - z.B.:

Quelltext
1:
2:
10001011 ->   2^7 +  2^6 +  2^5 +  2^4 + 2^3 + 2^2 + 2^1 + 2^0
10001011 -> 128*1 + 64*0 + 32*0 + 16*0 + 8*1 + 4*0 + 2*1 + 1*1 = 119

Ich weiss nicht, inwieweit du eine optimierte Lösung brauchst, also die Methode nachher auch verwenden willst...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function BinaerToDezimal(pBinaerzahl: array of (0,1)): Integer;
var
  i: Integer;
begin
  result := 0;
  if length(pBinaerzahl) <> 0 then begin
    for i := 0 to high(pBinaerzahl) do begin
      inc(result,pBinaerzahl[i] * Power(2,Index1));  //2^i
    end;
  end;
end;

Eventuell gibt es auch eine Möglichkeit die ausnutzt, dass der Computer intern ja sowieso mit Binärzahlen rechnet. Das varlangt dein Lehrer aber glaub' ich nicht - denn der will ja, dass du dich mit Binärzahlen beschäftigst.
Das geht bestimmt besser - ich glaube nicht, dass Boolean die Optimallösung dafür ist. Gibt es eig. den Datentyp bit, also bit = (0,1)??? Unter dem Namen schonmal nicht..

Edit: Überarbeitet und präzisiert.

mfG,


Kroko - Sa 16.02.08 18:07

user profile iconLorenzS hat folgendes geschrieben:
versuch mal mit IntToStr und StrToInt.
:?:

user profile iconLorenzS hat folgendes geschrieben:
die frage ist was ist für dich eine Binäre Zahl? Int64/Longword/Integer/Word/Byte oder ein String aus den Zeichen '0' und '1'?

:?
theoretisch, zBsp: 0010b

zum Thema
wie würdest Du es auf dem Papier machen? Probiere es einmal schriftlich durch und setze dies dann in einer Prozedure um! Wenn es dann Probleme gibt, frage konkret weiter.
Hier mach keiner deine HA ohne Geld,
für 20€ sende ich Dir die Proc. zu, :lol:


Kroko - Sa 16.02.08 18:09

@Hidden: Na, da wird er ja toll lernen, bekommt 'ne Eins und wird hoffentlich Dein Kollege, der keinerlei Ahnung, aber 'ne Eins hat, :(


Hidden - Sa 16.02.08 19:03

user profile iconKroko hat folgendes geschrieben:
@Hidden: Na, da wird er ja toll lernen, bekommt 'ne Eins und wird hoffentlich Dein Kollege, der keinerlei Ahnung, aber 'ne Eins hat, :(

Hi, user profile iconKroko

Was ich meinte war, dass dies dem Lehrer genügen könnte aber eigentlich eine unschöne, nicht zu sagen hässliche Lösung ist.

Edit: doppelquote entfernt.

mfG,


Kroko - Sa 16.02.08 19:47

@Hidden: Es ist aber Deine und nicht seine Lösung :!:


Hidden - Sa 16.02.08 20:19

@user profile iconKroko:
Hab' absichtlich nur die Hälfte geschrieben,
die muss er verstehen, um die zweite zu schreiben...
[/OT]


Narses - So 17.02.08 01:19

Moin!

user profile iconHidden hat folgendes geschrieben:
Mit Suche in der Entwickler-Ecke BIN?RCODE hast du dich schon beschäftigt?
[...]

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  Index1, Fakultaet{Hilfsvariable}: Integer;  //Suche in der Entwickler-Ecke FAKULT?T
[...]
    Fakultaet := 1;
    for Index1 := 0 to high(pBinaerzahl) do begin
      if pBinaerzahl[Index1] then
        inc(result,Fakultaet);
      Fakultaet := 2 * Fakultaet;
Vielleicht solltest du dich besser nochmal mit der Fakultät [http://de.wikipedia.org/wiki/Fakult%C3%A4t_%28Mathematik%29] beschäftigen, denn das, was du hier verwendest, ist ein Stellenwert, was eine bestimmte Potenz der Basis des Zahlensystems ist. :mahn:

cu
Narses


Hidden - So 17.02.08 08:36

Hi,

:oops: :oops: :oops:
Eig. weiß ich das...
habe es oben berichtigt.


-Nala- - So 17.02.08 12:05

Danke schonmal für die vielen Antworten...

Also...
wenn ich es auf dem Papier machen würde, dann würde das so ablaufen :

Angenommen wir haben den Binärcode : 100110

Dann wäre die dezimalzahl = 1*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 32 + 4 + 2 = 38
(das ist im prinzip leicht zu programmieren, aber ... ich habe keine Ahnung wie ich mich inerhalb einer Zahl auf die einzelnen stellen beziehen kann...)



Andersherum ist allerdings viel mehr schreibarbeit...

Angenommen wir haben die Dezimalzahl : 38

Dann würde ich mir zuerst eine liste machen in der ich die ganzen 2^... ergebnissen :
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64

da hör ich auf mit der liste .. da die 64 größer ist als die 38

Also weiß ich schonmal, dass unsere zahl 6 stellen hat...

ich fange also an : 1(für 2^5)
(ich rechne : 38 - 32 = 6)
es geht weiter: 1(für 2^5) 0 (für 2^4, da die 16 noch zu groß ist) 0 (für 2^3, da die 8 noch zu groß ist) 1 (für 2^2)
(ich rechne : 6 - 4 = 2)

es geht weiter: 1(für 2^5) 0 (für 2^4, da die 16 noch zu groß ist) 0 (für 2^3, da die 8 noch zu groß ist) 1 (für 2^2)
1(für 2^1)
(ich rechne : 2 - 2 = 0) -> alle restlichen stellen sind 0.

letzendlich ist die Binärzahl = 100110

ziemlich kompliziert...


Fabian E. - So 17.02.08 13:21

user profile icon-Nala- hat folgendes geschrieben:

(das ist im prinzip leicht zu programmieren, aber ... ich habe keine Ahnung wie ich mich inerhalb einer Zahl auf die einzelnen stellen beziehen kann...)


das ist einfach. du könntest deine zahl in einen string verwandeln und dann über MyString[i] auf einzelne zeichen zugreifen. die einzelnen zeichen kannst du bei bedarf auch wieder in eine zahl umwandeln.

gruß


Kroko - So 17.02.08 18:08

fehlt dir and?
(Zahl and 32)>0 heißt Bit6 gesetzt
(Zahl and 32)=0 heißt Bit6 nicht gesetzt


-Nala- - So 17.02.08 20:01

Bit 6 ???
Was ist das ?

und was ist Mystring ??? Wie kann ich mich genau auf die Zeichen beziehen ? Kann mir vllt. jemand einen Quelltext hochladen, in dem er dieses Mystring benutzt ?


Hidden - So 17.02.08 20:08

Hi,

mit Bit6 ist Bit Nr. 6 gemeint, d.h. die Eins hier:

Quelltext
1:
0000100000                    


myString ist ein Beispielname für einen String.
Zu strings solltest du Tutorials finden...
Suche in der Entwickler-Ecke DELPHI STRINGS

mfG,


-Nala- - So 17.02.08 20:31

Ah ok... ich glaube jetzt hab ich es so langsam verstanden...
Ich habe folgenden Quelltext geschrieben. Allerdings zeigt der pc mir die Fehlermeldung Zeigertyp erwartet an den stellen wo ich ein hoch zeichen hingeschrieben habe. wie kann ich bei delphi potenzieren? ich habe es mit ^ gemacht.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
begin
  i := Edit1.text;
  e := StrToInt(i[1])^0 + StrToInt(i[2])^1 + StrToInt(i[3])^2 + StrToInt(i[4])^3 + StrToInt(i[5])^4 + StrToInt(i[6])^5 + StrToInt(i[7])^6
  label3.Caption := 'Ergebnis : ' + IntToStr(e);
end;

end.


Marc. - So 17.02.08 20:35

Das Dach ( ^ ) verwendest du bei Delphi lediglich für Pointer.
Eine Möglichkeit zu Potenzieren wäre entweder eine eigene Funktion dazu zu schreiben oder die Funktion POWER() aus der Unit Math zu benutzen.

Grüße
Marc


Hidden - So 17.02.08 20:44

user profile icon-Nala- hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
begin
  i := Edit1.text;
  e := StrToInt(i[1])^0 + StrToInt(i[2])^1 + StrToInt(i[3])^2 + StrToInt(i[4])^3 + StrToInt(i[5])^4 + StrToInt(i[6])^5 + StrToInt(i[7])^6
  label3.Caption := 'Ergebnis : ' + IntToStr(e);
end;


Edit: in Kombination mit der for-Schleife.

mfG,


Kroko - So 17.02.08 21:11

user profile icon-Nala- hat folgendes geschrieben:
Bit 6 ???
Was ist das ?
...

Nee nicht doch, Umwandlung binär in dezimal, Info und keine Ahnung von Bits, Toll!
Siehe Suche in Wikipedia BIT


-Nala- - Mi 20.02.08 16:43

Also... ich habe das Programm nun mit dieser Length(mystring) funktion geschrieben. Allerdings ist immer noch etwas nicht in ordnung. Hier ist der Quelltext :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
  a ,b : integer;
  c : extended;
  s : string;
begin
  s := Edit1.Text;
  a := Length(s);

  for b := 1 to a do
    begin
      c := StrToInt(s[b]) * power(2 , (-1 + b) );
    end;

 label3.caption := 'Ergebnis : ' + FloatToStr(c);
end;


man müsste die ganzen ergebnisse für c noch addieren.. aber wie programmier ich das ??


Kroko - Mi 20.02.08 16:57

(a)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
  a ,b : integer;
  c : extended;
  s : string;
begin
  s := Edit1.Text;
  a := Length(s);
  C := 0;
  for b := 1 to a do
    begin
      c := c + StrToInt(s[b]) * power(2 , (-1 + b) );
    end;

 label3.caption := 'Ergebnis : ' + FloatToStr(c);
end;

sollte Dein Problem beheben
(b) Power (2,X) läßt sich ganzzahl-Ebene mit 1 shl x einfacher und schneller erledigen, daraus folgt

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  a ,b, c : integer;
begin
  a := Length(Edit1.Text);
  c := 0;
  for b := 0 to a-1 do
    if Edit1.Text[a+1]='1' then Inc(c,1 shl b); 

 label3.caption := 'Ergebnis : ' + IntToStr(c);
end;


mhxcm - Mi 20.02.08 16:57

user profile icon-Nala- hat folgendes geschrieben:
Andersherum ist allerdings viel mehr schreibarbeit...

Angenommen wir haben die Dezimalzahl : 38

Dann würde ich mir zuerst eine liste machen in der ich die ganzen 2^... ergebnissen :
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64

da hör ich auf mit der liste .. da die 64 größer ist als die 38

Also weiß ich schonmal, dass unsere zahl 6 stellen hat...

ich fange also an : 1(für 2^5)
(ich rechne : 38 - 32 = 6)
es geht weiter: 1(für 2^5) 0 (für 2^4, da die 16 noch zu groß ist) 0 (für 2^3, da die 8 noch zu groß ist) 1 (für 2^2)
(ich rechne : 6 - 4 = 2)

es geht weiter: 1(für 2^5) 0 (für 2^4, da die 16 noch zu groß ist) 0 (für 2^3, da die 8 noch zu groß ist) 1 (für 2^2)
1(für 2^1)
(ich rechne : 2 - 2 = 0) -> alle restlichen stellen sind 0.

letzendlich ist die Binärzahl = 100110

ziemlich kompliziert...


Nur mal so nebenbei, auf em Papier würde ich das so rechnen:

38 / 2 = 19 Rest 0
19 / 2 = 9 Rest 1
9 / 2 = 4 Rest 1
4 / 2 = 2 Rest 0
2 / 2 = 1 Rest 0
1 / 2 = 0 Rest 1

wenn du jetzt den Rest von unten nach oben liest hast du deine Binärzahl... klappt hundertpro immer ;)

mfg


-Nala- - Mi 20.02.08 21:08

@Kroko:

Ich habe es mit deinem ersten Quelltext versucht. Gebe ich aber die Zahl 10 oder irgendeine Zahl mit einer 0 am Ende ein so ist das ergebnis immer 1.
Wie kann man diesen Fehler beheben ?


Kroko - Mi 20.02.08 21:21

oh Mist, verkehrt herum den String durchlaufen,

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  a ,b, c, h : integer;
begin
  a := Length(Edit1.Text);
  c := 0;
  H := 1;
  for b := a downto 1 do
  begin
    if Edit1.Text[b]='1' then Inc(c,h);
    H := H shl 1// H*2 
  end
 label3.caption := 'Ergebnis : ' + IntToStr(c);
end;


-Nala- - Mi 20.02.08 23:21

Ja! Es funktioniert :D.
Vielen Dank !

Wenn ich das Programm jetzt auch noch so haben möchte, dass es außerdem noch von Dezimal nach Binär rechnen Kann, wie muss ich das einbinden? Kann man das wieder durch so eine For-Schleife machen ?
Wenn ja wie ?


Kroko - Do 21.02.08 08:45

Dez+Dez = dez -umwandeln nach binär


-Nala- - Do 21.02.08 19:53

??? das versteh ich nich ...
Kannst du mir das nochmal genauer erklären?


Yogu - Do 21.02.08 20:31

Einmal nach Suche bei Google INTTOBIN googeln, und das erste Ergebnis nehmen:

BinToInt und IntToBin in den Delphi-FAQsen [http://www.faqsen.de/delphi/faq.jsp?ID=505448494850485753534950]

Da der Server aber anscheinend öfters Probleme hat ;) hier nochmal der Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function IntToBin(i: Int64): String;
var x: Integer;
begin
  if i > 0 then
  begin
    Result := '';
    x := 1;
    while i >= x do
    begin
      Result := IntToStr((i and x) div x) + Result;
      x := x shl 1;
    end;
  end
  else
    result := '0';
end;

function BinToInt(b: String): Int64;
var x, lg: Integer;
begin
  b := Trim(Copy(b, Length(b) - 6364));
  lg := Length(b);
  Result := 0;
  for x := lg downto 1 do
    Result := Result + (StrToInt(b[x]) shl (lg - x));
end;

Anmerkung: Der Text ist etwas umformuliert. Ganz zufrieden bin ich zwar immer noch nicht, aber die Variablennamen wollte ich jetzt nicht auch noch ändern ;)


oldmax - Fr 22.02.08 07:42

hi
Da will ich auch mal meinen Senf zu geben....
Du möchtest eine integer nach binär haben, dann bau eine Funktion.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Function TMyForm.IntToBinSTR(Zahl : Integer): String// der kommt in ein Editfeld
Var CalcWert : Integer;
    ReWert   : String;
Begin
  Rewert:='';
  CalcWert:=Zahl;
  Repeat // Schleifenbeginn
    If (CalcWert=Trunc(Calcwert/2)*2then Rewert:='0' +Rewert
    else Rewert:='1' +Rewert // String baut von hinten nach vorn auf
    Rewert:=Trunc(Rewert/2);
  until Rewert:=0;
  While Length(Rewert)  <8 then ReWert:='0'+Rewert;// auffüllen für vollständiges Byte
  Result:=ReWert;
End;

Dahinter steckt einfach nur die Teilung einer Zahl durch 2, wie bereits schon irgendwo erklärt. Der Rest aus dieser Division, 1 oder 0. wird in den Bytestring eingetragen und die Teilung solange wiederholt, bis das Ergebnis 0 ist. Das Auffüllen erfolgt nur, weil bei einer Zahl 2 z. b. das Ergebnis nur '10' wäre, ein Byte hat jedoch 8 Bit. Bei einem Word muß die Größe auf 16 Bit entsprechend angepaßt werden. Sieht halt schöner aus.
Der Aufruf
Edit1.Text:=IntToBinStr(2);
sollte '00000010' für ein Byte ergeben.
Gruß oldmax


-Nala- - Fr 22.02.08 13:25

Vielen Dank für die vielen Antworten !
Nun läuft das Programm :D:D

hier könnt ihr es herunterladen :

http://www.file-upload.net/download-683207/Bin-rumwandler.exe.html