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,
LorenzS 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
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)); 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
LorenzS hat folgendes geschrieben: |
versuch mal mit IntToStr und StrToInt. |
:?:
LorenzS 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
Kroko 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,
Kroko
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
@
Kroko:
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!
Hidden hat folgendes geschrieben: |
Mit BIN?RCODE hast du dich schon beschäftigt?
[...]
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Index1, Fakultaet: Integer; [...] 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
-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:
myString ist ein Beispielname für einen String.
Zu strings solltest du Tutorials finden...
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
-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; | |
- Denk noch einmal nach, ob so denn das richtige Ergebnis herauskommen würde.
- deine Prozedur braucht einen konstant langen string, schau dir doch noch einmal
LENGTH(MYSTRING) an.
Edit: in Kombination mit der for-Schleife.
mfG,
Kroko - So 17.02.08 21:11
-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
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
-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; 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
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) - 63, 64)); 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; Var CalcWert : Integer; ReWert : String; Begin Rewert:=''; CalcWert:=Zahl; Repeat If (CalcWert=Trunc(Calcwert/2)*2) then Rewert:='0' +Rewert else Rewert:='1' +Rewert Rewert:=Trunc(Rewert/2); until Rewert:=0; While Length(Rewert) <8 then ReWert:='0'+Rewert; 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!