![]() |
bin2dec
Hi Leute!
Bin neu hier, mein erster Post, und gleich ne wichtige Frage für meine Hausaufgaben, ich hoffe das mir jemand helfen kann, natürlich werde ich in meiner längeren oder kürzeren Boardlaufbahn natürlich auch versuchen euch etwas zu helfen! Also, die Aufgabenstellung: Auf Knopfdurck soll eine Binärzahl (also 0, 1) aus einem Eingabefeld eingelesen werden, daraus soll die Dezimalzahl bestimmt werden, sowie ausgegeben werden, das ganze ist auch noch in viele Unterprogramme zu unterteilen, wobei hier bei mir nicht das Problem liegt. Mein Problem ist, das ich nicht weiß wie ich Die Binärzahlen in Dezimal umwandeln soll, zuerst dachte ich ans Hornerschema, aber das geht ja denke ich nur richtig umgekehrt, über Hex umwandeln wäre zu kompliziert, Hochzahlen wären ja eine Möglichkeit, aber ich bin mir nicht sicher wie ich die Anwenden soll! Ich hoffe ihr habt ein paar Tipps für mich!! mfg n00b_on_knees :bounce1: |
Hallo und herzlich Willkommen im Forum!
Damit kann man dies machen, aber vorsicht, Du musst ncoh abfragen rien machen ob es immer genug Stellen sind und das keine Buchstaben dabei sind usw..
Delphi-Quellcode:
Grüsse, Daniel :hi:
procedure TForm1.Button1Click(Sender: TObject);
begin ShowMessage(IntToStr(Byte(StrToInt(Edit1.Text)))); end; |
oha das ist ja eine sehr kurze Lösung! Danke!
Werde ich auf jeden Fall mal ausprobieren, allerdings Frage ich mich ob mein Lehrer das anerkennen wird, da er sich eventuell etwas "komplizierter" haben will (abgesehen von den functionen die ja schon nerven, da es ja anders viel schneller gehen würde, aber wir müssen ja grade bei diesem Kapitel sein)! hast du (oder jemand anderes) eine etwas längere lösung? Edit: Obwohl, ich glaube ich lass es doch bei der Lösung :D |
Also, mit Zwischenvariablen und in jeder Zeile wird was umgewandelt.
Das ist ja mal eine Herrausforderung, schriebe etwas so umständlich wie möglich. ;) :mrgreen: //Hmm, gar nciht so einfach ;)
Delphi-Quellcode:
Besser?
procedure TForm1.Button1Click(Sender: TObject);
var sEdit, sErgebnis: String; iEdit: Integer; bEdit: Byte; begin sEdit := Edit1.Text; //Text aus dem Edit, also Bits einer Variable zuweisen iEdit := StrToInt(sEdit); //Dann die Variable in einen Integer umwandeln da der Edit es als String hat bEdit := Byte(iEdit); //Dann den Integer in ein Byte umwandeln sErgebnis := IntToStr(bEdit); //Den Wert des Bytes wieder in einen String umwandeln ShowMessage(sErgebnis); //Und schliesslich das Ergebniss in einer Message ausgeben end; Grüsse, Daniel :hi: |
Hallo,
wenn Du es noch 'komplizierter' möchtest, dann schau mal:
Delphi-Quellcode:
Du brauchst eine TEdit und einen TButton
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR i : integer; bin : Extended; Dec : Extended; BEGIN bin := 1; dec := 0; FOR i := 1 TO length(Edit1.text) DO BEGIN bin := intpower(2, i - 1); IF Edit1.text[i] = '1' THEN dec := dec + bin; END; showMessage(FloatToStr(dec)); END; Achtung: das LSB ist links! D.H. 1011 -> 2^0 + 2^2 + 2^3 = 1 + 4 + 8 = 13 |
danke, das is mir schonmal sehr geholfen... nur wie überprüfe ich den ganzen string auf 0 und 1en? wenn darin nur jeweils eben eine Zahl wäre, würde das einfacher gehen, wie geht es mit einer if abfrage, nur weitergemacht wird, wenn sich eben 0 und 1 drin befinden, buchstaben etc. nicht? Ansonsten wird eben eine ShowMessage mit einer Fehlermeldung anegeben...
|
Hallo,
also mit folgendem Code, kann man in dem Edit nur noch 0, 1 und BackSpace drücken, somit kann man schonmal nichts falsches eingeben.
Delphi-Quellcode:
Dann gibt es beim Edit im Objekt Inspector noch die Eigenschaft MaxLegth, das stellst Du auf 8. Damit man nur 8 Stellen maximal eingeben kann. Sonst ist es ja kein Byte mehr, sondern ein Word oder sonst was. ;)
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin if not (Key in ['0', '1', #8]) then Key := #0; end;
Delphi-Quellcode:
Das bewirkt, das Dein Code nur ausgeführt wird, wenn im Edit 8 Stellen drin sind, falls dies nicht der Fall ist, also weniger, wird dann die eine Message ausgegeben.
if Lenght(Edit1.Text) < 8 then
begin ShowMessage('Zuwenig Stellen!'); end else begin //hier kommt dann die umrechnung rein. end; Grüsse, Daniel :hi: |
thx nochma für die ganzen antworten, ich werde das aber erst morgen ausprogrammieren... bin heute nachmittag auch die ganze zeit an einem anderem sinnlosen prog sitzen müssen!
|
Moin Noob on Knees,
und so ginge es auch:
Delphi-Quellcode:
function BinToInt(const AsValue : string) : integer;
const // In einer Binärzahl erlaubte Ziffern _aBinDigits = ['0','1']; var iPowerOfTwo : integer; // Enthält den Wert der 2er Potenz der gerade bearbeiteten Stelle i : integer; // Schleifenzähler begin Result := 0; // Ergebnis initialisieren iPowerOfTwo := 1; // mit 2 hoch 0 anfangen // Auf gültige Länge prüfen if (length(AsValue) < 1) or (length(AsValue) > 32) then begin // Sonst Exception erzeugen raise Exception.Create('Die Zahl muss zwischen 1 und 32 Stellen haben.'); end; // mit der niederwertigsten Stelle anfangen und hocharbeiten for i := length(AsValue) downto 1 do begin // Auf gültige Ziffer prüfen if not (AsValue[i] in _aBinDigits) then begin // falls nicht Exception erzeugen raise Exception.Create('Es dürfen nur die Ziffern 0 und 1 vorkommen.'); end; // Wenn die Stelle eine 1 ist if AsValue[i] = '1' then begin // dann das entsprechende Bit setzen Result := Result or iPowerOfTwo; end; // Wert für nächste Stelle setzen iPowerOfTwo := iPowerOfTwo shl 1; end; end; |
Moin Christian,
Zitat:
Delphi-Quellcode:
Grüsse, Daniel :hi:
procedure TForm1.Button1Click(Sender: TObject);
var bByte: Byte; iErgebnis: Integer; begin iErgebnis := 0; bByte := StrToInt(Edit1.Text); if (bByte and 1) <> 0 then iErgebnis := iErgebnis + 1; if (bByte and 2) <> 0 then iErgebnis := iErgebnis + 2; if (bByte and 4) <> 0 then iErgebnis := iErgebnis + 4; if (bByte and 8) <> 0 then iErgebnis := iErgebnis + 8; if (bByte and 16) <> 0 then iErgebnis := iErgebnis + 16; if (bByte and 32) <> 0 then iErgebnis := iErgebnis + 32; if (bByte and 64) <> 0 then iErgebnis := iErgebnis + 64; if (bByte and 128) <> 0 then iErgebnis := iErgebnis + 128; ShowMessage(IntToStr(iErgebnis)); end; |
das sind nicht gerade wenig lösungen! seid ja echte profis ;) werde mir halt mal alles zusammenbasteln, ich frage mich nur wie ich meinem lehrer erkläre wo ich die guten lösungen herhabe :spin:
@daniel ist das anstatt mit den ganzen if abfragen nicht irgenwie mit einem case oder etwa einer schleife wo sich der wert verdoppelt besser? |
Zitat:
Aber sag doch, Du hast Dir sagen lassen welche Funktionen man für sowas braucht, dann hast Du Dir die OH zu den ganzen sachen angeschaut, hast Dein Hirn eingeschaltet und das alles zusammengebastelt. :) Zitat:
Wenn Du es aber selbst kapierst/machst, dann kannst Du es Ihm sogar erklären. Aber ich denke das Du schon genug Lösungen hast. Mehr als eine 1+ kannst Du eh nicht bekommen. ;) Grüsse, Daniel :hi: |
Delphi-Quellcode:
ich verstehe nur von diesem nicht so ganz den sinn, also das mit den zuweisungen ist mal klar, dann...
iErgebnis := 0;
bByte := StrToInt(Edit1.Text); if (bByte and 1) <> 0 then iErgebnis := iErgebnis + 1; .... if (bByte and 128) <> 0 then iErgebnis := iErgebnis + 128;
Delphi-Quellcode:
wozu das 'und' in der if Abfrage? das verstehe ich nicht ganz
wenn das Editfeld und 1 ungleich 0 sind dann
setze das Ergebnis auf Ergebnis + 1; ... wenn das Editfeld und 128 ungleich 0 sind dann setze das Ergebnis auf Ergebnis + 128; // achja nochmal zu dem mit dem Case, ich denke mal es fällt am wenigsten richtig auf wenn ich Case einbaue, oder es mit einem else Zweig versuche ;) |
Da sieht man es wieder, Dir fehlt es einfach an den Grundlagen, daher solltest Du dies wohl eher nicht benutzen, es sei denn Du kannst es erklären.
Also, and spielt in diesem Zusammenhang eine ganz andere Rolle und zwar nicht ein normales and wie als wenn man z.B. zwei Variablen vergleichen würde.
Delphi-Quellcode:
Das end Vergleicht hier einfach nur als "Boolean, wenn also beides Zutrifft, dann gehts weiter.
if (i = 0) and (j = 1) then
Aber wenn Du ein Byte, ein and und ein ZahlenWert einen Bytes dann kannst Du damit Prüfen ob bestimmte Bity eines Bytes 1 oder 0 sind. Das ist etwas blöd zum Erklären. Also ein Byte hat ja 8 Bits, Bit 0 bis Bit 7. Bit 0 hat die Wertigkeit 1, das nächste 2, das nächte 4 usw, Bit 7 hat also die Wertigkeit 128. Und wenn alle 8 Bits 1 sind, dann hat Dein Byte den Wert 255. Ganz normale Binärrechnung. Bei meinem Code, orüft man jedes Bit in dem Byte einzeln ob es 0 oder 1 ist. Wenn es 0 ist dann gehts micht ncihts an und wenn das Bit eine 1 ist, dann muss ich es also Addieren.
Delphi-Quellcode:
Wenn also das Bit 3 ungleich 0 ist, wäre dann also 1, dann muss man ja das Ergebniss um 8 erhöhen.
if (bByte and 8) <> 0 then iErgebnis := iErgebnis + 8;
Ausgeschrieben sieht es dann so aus:
Code:
Hoffe das es jetzt verständlicher ist.
BitNr.
87654321 00000001 = 1 00000010 = 2 00001000 = 8 Grüsse, Daniel :hi: |
ok danke, jetzt versteh ich das besser... binärrechnen kann ich, trotzdem danke, mir war nur das mit dem "and" nicht so ganz klar...!
tja die grundlagen... ich bin in der schule (bin im herbst in die erste klasse neu reingekommen) nicht gerade sehr gut in programmieren, ist wohl nicht gerade ein besonderes talent von mir, bin gerade mit einer 4 durchgekommen...! |
Moin Daniel,
eines ist mir gerade wieder aufgefallen: Du errechnest aus einer Dezimalzahl eine Dezimalzahl, Noob on Knees möchte aber aus einer Binärzahl (Zahl mit Basis 2) eine Dezimalzahl (Zahl mit Basis 10) errechnen ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz