Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Ein Freund soll für die Schule ein Program schreiben, dass integerwerte in binärwerte umwandelt und sie auf dem Bildschirm ausgibt. Sie benutzen dort Pascal 5.5. und da ich nur Delphi benutze und derartige umwandlungen durch beiligende funktionen meist ohne weiteres umgewandelt werden kann ich ihm leider nicht auf de schnelle weiterhelfen.
Also meine frage, wie kann ich mit Hilfe von Turbo Pascal 5.5 oder üerhaupt Turbo Pascal innerhalb einer Funktion einen integerert in einen Binärwert umwandeln? Wäre nett, wenn ihr mir wieder mal helfen könntet! Evian [edit=Luckie] Mfg, Luckie[/edit] |
Re: Frage zu Pascal
Falls enige überhauüt mit Turbo Pascal gearbeitet haben, TP hat fast den selben wortschatz wie Delphi... nur das es nicht die ganzen Units mit den Hilfsfunktionen gibt, also wenn mir jemand sagen könnte, wie man in Delphi eine dezimal - Zahl in einer binärzahl, ohne die Hilfe einer Funktion wie "inttobin()" umrechnen kann, würde mir das auch schon helfen.
|
Re: Frage zu Pascal
Delphi-Quellcode:
Und was bekomme ich jetzt dafür, dass ich anderer Leute die hausaufgaben mache? :roll:
function IntToBin(Int: Integer): String;
var i : Integer; begin Result := ''; for i := 7 downto 0 do Result := Result + IntToStr((Int shr i) and 1); end; function BinToInt(Binary: String): Integer; var i : Integer; begin Result := 0; for i := Length(Binary) downto 1 do Inc(Result, StrToInt(Binary[i]) * 1 shl (Length(Binary) - i)); end; |
Re: Frage zu Pascal
Mh... ich würd Dir ja so einiges geben, aber da es die funktion inttostr und shr unter PASCAL nicht gibt, und somitt die Hausaufgaben noch nicht gemacht sind, kann ich Dir auch nichts geben... *g*
Hast Du nicht noch nen anderen Tip? |
Re: Frage zu Pascal
Fpür IntToStr kannst du auch val nehmen, sollte es auch unter TP geben. Den Ersatz für ShiftRight (shr) kann ich dir nicht nennen, da ich nie mit TP gearbeitet habe.
|
Re: Frage zu Pascal
was genau mach shr, vielleich kann ich das ja anders umsetzen?
|
Re: Frage zu Pascal
Es verschiebt die Bits um angegeben Anzahl von Bits nach rechts.
|
Re: Frage zu Pascal
Mh... schade, das hilft mir auch nicht weiter.. ich denke, dass kann ich so einfach in Pascal auch nichte realisieren. :(
|
Re: Frage zu Pascal
Dann implementier den Algorithmus, wie man es auch von Hand machen würde:
Code:
Der Rest von Oben nach untengelesen ergibt die Zahl im Binärsystem.
15 / 2 = 7 R1
7 / 2 = 3 R1 3 / 2 = 1 R1 1 / 2 = 0 R1 |
Re: Frage zu Pascal
Weil mir langweilig war:
Delphi-Quellcode:
Und das war wohl auch Sinn der Aufgabe, diesen Algorithmus umzusetzten. shr hätte wohl das Thema sowieso verfehlt.
function IntToBin(IntNumber: Integer): string;
function OtherWayRound(s: string): string; var Loop: Integer; begin for Loop := length(s) downto 1 do begin result := result + s[Loop]; end; end; var res: Integer; begin res := IntNumber; while res <> 0 do begin result := result + IntToStr(res mod 2); res := res div 2; end; result := OtherWayRound(result); end; Und was bekomme ich jetzt, außer einen feuchten Händedruck und dass dein Freund meine Lorbeeren einstreicht? :roll: |
Re: Frage zu Pascal
na na!!! Du hast doch wieder inttostr benutzt :) ...
aber müsste es nicht so gehen:
Delphi-Quellcode:
?!
function IntToBin(i: Integer): string;
VAR h, e, c : integer; s, s2 : STRING; BEGIN h := i; e := 0; REPEAT h := h DIV 2; e := i MOD 2; VAL(s,e,c); s2 := s2 + s; UNTIL h < 2; inttobin := s2; end; Evian [edit=Luckie]Delphi-Tags ergänzt. Ein bischen Code formatieren könnte auch nicht schaden. :wink: Mfg, Luckie[/edit] |
Re: Frage zu Pascal
Sorry, auch gerade gemerkt.
Hier die Komplettlösung - hin und zurück:
Delphi-Quellcode:
Probier deinen Code doch aus.
function IntToStr(IntNumber: Integer): string;
begin Str(IntNumber, result); end; function StrToInt(s: String): Integer; var code: Integer; begin val(s, result, code); end; function IntToBin(IntNumber: Integer): string; function OtherWayRound(s: string): string; var Loop: Integer; begin for Loop := length(s) downto 1 do begin result := result + s[Loop]; end; end; var res: Integer; begin res := IntNumber; while res <> 0 do begin result := result + IntToStr(res mod 2); res := res div 2; end; result := OtherWayRound(result); end; function BinToInt(s: string): Integer; var Loop: Integer; Multiplier: Integer; begin result := 0; Multiplier := 1; for Loop := 1 to length(s) do begin result := result + StrToInt(s[Loop]) * Multiplier; Multiplier := Multiplier * 2; end; end; procedure TForm1.Button1Click(Sender: TObject); const IntNumber = 17; BinNumber = '10001'; begin ShowMessage(IntToBin(IntNumber)); ShowMessage(IntToStr(BinToInt(BinNumber))); end; |
Re: Frage zu Pascal
Hatte am WE keine Zeit mehr..., aber Danke für die Hilfe ohne Deinen Grundansatz hätte ich wohl noch lange gerätzelt!
MFG Evi |
Re: Frage zu Pascal
Grundansatz ist gut. Der letzte Code ist die komplette Lösung.
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Ich habe nicht Deinen Code übernommen, sondern mit dem Tip:
15 / 2 = 7 R1 7 / 2 = 3 R1 3 / 2 = 1 R1 1 / 2 = 0 R1 ..einen eigenen gemacht, da Deiner so wie er als letztes Gepostet wurde auch wieder nicht ging. |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Ich auch :firejump:
Den Thread hatte ich gar nicht gesehen :cry: Hier mal meine Lösung komplett ohne StrToInt und ohne IntToStr. Und ohne OtherWayRound (@Luckie: das wäre auch einfacher gegangen)...
Delphi-Quellcode:
...:cat:...
function IntToBin(Value: Word): String;
const BIN_VALUE: array[0..1] of Char = ('0', '1'); begin Result := ''; while Value > 1 do begin Result := BIN_VALUE[Value and $01] + Result; Value := Value div 2; end; Result := BIN_VALUE[Value and $01] + Result; end; function BinToInt(Value: String): Word; const INT_VALUE: array['0'..'1'] of Byte = (0, 1); var I: Integer; begin Result := 0; for I := 1 to Length(Value) do begin Result := Result * 2; Result := Result + INT_VALUE[Value[I]]; end; end; |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Halt, da hast du wieder die and-Verknüpfung drin. Ich denke Ziel des Lehrers war es den Algorithmus, wie man es von Hand macht in Programmcode zufassen.
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Hm, wenn der Lehrer nicht genug IQ hat, um zu wissen, daß and auch "von Hand" ist, dann halt so:
Delphi-Quellcode:
...:cat:....
function IntToBin(Value: Word): String;
const BIN_VALUE: array[0..1] of Char = ('0', '1'); begin Result := ''; while Value > 1 do begin Result := BIN_VALUE[Value mod 2] + Result; Value := Value div 2; end; Result := BIN_VALUE[Value mod 2] + Result; end; |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
OK. Mal sehen, ob wir noch eine Rückmeldung zwecks unserer Note bekommen. :gruebel:
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Zitat:
fünf -> Setzen. *gggg* Sorry: Das musste sein :lol: |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
-> :lol: <-
ach ja nur zum schluss, falls noch mal jemand was zu TPascal fragt, das ergebniss von Funktionen kann da nicht mit Result angesprochen werden, sondern nur über den Funktionsnamen selbst. |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Zitat:
Stimmt. Ich habe mein erstes Programm in TP 5.5 verkauft. (Damals für 5000 DM) leider habe ich einiges vergessen. Aber Du hast recht. [edit=Luckie]Quote-Tags gefixt. Mfg, Luckie[/edit] |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
*alten Thread wieder hochkram*
Gibt es auch eine mathematische Formel (also kein Pascal-Code!) für die Umrechnung von Dezimal nach Binär? Ich meine nicht die wo man immer durch zwei teilt und den Rest hinschreibt, sondern eine ganz allgemeine, die man auf eine Zeile schrieben kann. Gibt's sowas? |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Nein, da ja die Zahl so lange bis sie Null ist Ziffer für Ziffer zur Zielbasis umgewandelt werden muß. Somit benötigt man immer eine Schleife. Natürlich gibt es eine Mathematische Formel, nur auch diese umschreibt einen iterativen Algorithmus.
Hier noch eine Lösung ohne Divisionen oder Shiftoperatoren:
Delphi-Quellcode:
Gruß hagen
function IntToBIN(const Value: Cardinal): String;
const sDigits: array[Boolean] of Char = ('0', '1'); var I: Integer; Mask: Cardinal; begin SetLength(Result, 32); Mask := 1; for I := 32 downto 1 do begin Result[I] := sDigits[Value and Mask <> 0]; Inc(Mask, Mask); end; end; |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Zitat:
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Hi Lucky,
ich hab mal ne Frage zu einem Post von dir, der schon einige Zeit her ist. function IntToBin(Int: Integer): String; var i : Integer; begin Result := ''; for i := 7 downto 0 do Result := Result + IntToStr((Int shr i) and 1); end; Es geht um die vorletzte Zeile.Es geht um den Befehl and 1. Soweit meine ich alles verstanden zu haben, nur dieser Befehl gibt mir noch zu denken. Die Funktion soll ja eine eigegebene Zahl vom Typ Integer in eine Binärzahl umwandeln. Die Funktion shr bewirkt, dass die umgewandelte Zahl um i Stellen nach rechts verschoben wird. Mir ist nur noch nicht klar, was das "and 1" zu bedeuten hat. Wäre nett wenn du mir helfen könntest. Mfg Kristoffer |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
and macht eine Und-Bitverknüpfung, d.h. wenn 2 Zahlen an der gleichen Bitadresse eine 1 stehen haben, so wird im Ergebnis für diese Bitstelle eine 1 ausgegeben. Ist nur einer der beiden Bitadressen null (oder beide), so wird 0 ausgegeben.
bsp: 5 = 0101 12 = 1100 5 and 12 = 0101 and 1100 = 0100 = 4 5 and 12 = 4 |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Herzlich willkommen in der Delphi-PRAXiS, Kristoffer.
Durch "i AND 1" werden effektiv alle bis auf das niederwertigste Bit von i ausgeschaltet. Genauso schaltest du mit "i OR 1" das niederwertigste Bit ein, falls es nicht schon eingeschaltet ist. Freundliche Grüße |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Ja die Frage ist nur warum brauche ich das in diesem Beispiel?
Trotzdem schonmal danke für die Antwort. |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Weil du die Bits in i einzeln betrachten möchtest. Du schiebst sie bitweise mit "shr 1" nach "rechts" und schaltest dann alle außer dem am weitesten "rechts" stehenden Bits aus, so dass du im Einzelfall nur noch 0 oder 1 erhältst.
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
hallo,
wollte dieses thema nochmal aufgreifen.. für mich ist delphi noch komplett neu, sprich genau diese aufgabe ist meine erste kleine funktion die ich schreiben soll... da ich aber nun nicht nur einfach das ergebnis haben möchte sondern auch gerne verstehen möchte was genau wo passiert wäre es klasse wenn mir das jemand von euch mal kurz erklären könnte :) |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Hallo Poldy, willkommen in der DP :dp: . Da das meiste bestimmt bereist erklärt wurde, zeige ich Dir nur ein Beispiel mit einer Zahl (hier 125), einer Vergleichszahl und einem Ergebnisstring:
Delphi-Quellcode:
StringVariable ist noch leer, Vergleichszahl ist 1
01111101 //zu untersuchende Zahl 00000001 //Vergleichszahl -------- 1 Stringvariable := '1' + Stringvariable;// -> Stringvariable = '1' Vergleichszahl := Vergleichszahl * 2; 01111101 //zu untersuchende Zahl 00000010 //Vergleichszahl -------- 0 Stringvariable := '0' + Stringvariable;// -> Stringvariable = '01' Vergleichszahl := Vergleichszahl * 2; 01111101 //zu untersuchende Zahl 00000100 //Vergleichszahl -------- 1 Stringvariable := '1' + Stringvariable;// -> Stringvariable = '101' Vergleichszahl := Vergleichszahl * 2; usw. |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
danke für deine antwort aber um ehrlich zu sein versteh ich das mal so garnicht :(
also am sinnvollsten scheint mir folgende lösung zu sein function IntToBin(Value: Word): String; (wofür steht das word? ist das eine art string?) const (welche bedeutung hat const? ist damit eine constante gemeint?) BIN_VALUE: array[0..1] of Char = ('0', '1'); begin Result := ''; while Value > 1 do begin Result := BIN_VALUE[Value mod 2] + Result; Value := Value div 2; end; Result := BIN_VALUE[Value mod 2] + Result; end; mein problem hier bei ist, dass die sprache für mich halt komplet neu ist und ich lediglich ein wenig javakenntnisse habe... hilfreich wäre hierbei für mich wenn mir jemand zeile für zeile genau erklären würde was dort passiert.. ich weiss das da ein arraylist angelegt wird die mit char gefüllt ist und diese entweder 1 oder 0 sind.. anschliessend beginnt dann eine while schleife... diese verstehe ich nicht komplet lediglich das da der value nach einer prüfung durch 2 geteilt wird.. anschliessend wird dann das result ausgegeben.. wie genau sich das zusammensetzt versteh ich allerdings auch nicht... wenn mir da jemand noch ein wenig nachhilfe gben könnte wäre das wirklich sehr nett :) |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Lies Dir das hier erst einmal gründlich durch, dann wirst Du mein Beispiel auch eher verstehen.
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
ok.. also das verstehe ich jetzt schon so im groben.. hatten die tage auch in der gruppe die sachen mit and or bzw xor besprochen allerdings verstehe ich da noch nicht den zusammenhang zu meiner aufgabe...
hierbei gehts darum das wir ein programm schreiben sollen das jede binärzhl in eine dualzahl umwandelt und dafür soll ich die methode schreiben... dabei ist es doch für mich nicht interessant ob ich and or bzw xor habe oder bin ich jetzt völlig auf dem falschen dampfer? |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Wie willst Du das denn herausfinden, ob ein Bit gesetzt ist? Du musst schon bitweise mit and vergleichen. So habe ich es oben gezeigt (vom niederwertigsten zum höchstwertigen Bit).
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
ah.. so langsam verstehe ich dich.. also zumindest den grundgedanken..:)
aber wie genau muss ich dann den quellcode schreiben um die binärzahl in eine dualzahl umzuwandeln? in dem tutorial hast du es ja allgemein gehalten... was ich dabei nicht verstehe ist dein setzen der constanten...also lesen =1... sorry bin wirklich blutiger anfänger und habe weder ein tolles dephibuch noch ein komplettes tutorial... mal abgesehen avon das ich leider nicht die zeit habe das komplett zu durchzuarbeiten... |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Zitat:
Du schreibst Dir am Besten eine Funktion dafür.
Delphi-Quellcode:
Diese erwartet eine ganze Zahl vom Typ Cardinal (32 Bit ohne Vorzeichen) und gibt einen String zurück. In dieser Funktion deklarierst Du die lokale Variable Vergleichszahl (auch Cardinal) und belegst diese mit 1 (für das niederwertigste Bit). Nun tust Du in einer Schleife Folgendes: binärer and-Vergleich von Zahl und Vergleichszahl. Kommt dabei Vergleichszahl heraus, ist das Bit gesetzt und an das Funktionsergebnis (Result) wird links '1' angefügt, ansonsten '0'. Anschließend muss Vergleichszahl verdoppelt werden für das nächsthöhere Bit. Du kannst die Schleife beenden, wenn z.B. die Länge von Result (das ja ein String ist) der Speichergröße der Eingangszahl multipliziert mit 8 (weil 1 Byte = 8 Bit) entspricht.
function ZahlAsBinaryString(Zahl: Cardinal): String;
|
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
ok.. nun bin ich wieder bei den bömischen dörfern.... was ist denn bitte ein cadinal? ;)
wie würde denn deine konkrete funktion zum umwandeln aussehen? |
Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
Obwohl ich es eigentlich nicht tun wollte, hier mal die Umsetzung (normalerweise würde ich es kürzer machen, aber dann verstehst Du es bestimmt nicht):
Delphi-Quellcode:
function ZahlAsBinaryString(Zahl: Cardinal): String;
//Variable Vergleichszahl deklarieren var Vergleichszahl: Cardinal; begin //Vergleichszahl und Rückgabewert vorbelegen Vergleichszahl := 1; Result := ''; //Schleife (Ende, wenn das Ergebnis 32 Stellen hat) while Length(Result) < SizeOf(Cardinal) * 8 do begin //binärer Vergleich if (Zahl and Vergleichszahl) = Vergleichszahl then Result := '1' + Result else Result := '0' + Result; //Vergleichszahl verdoppeln Vergleichszahl := Vergleichszahl * 2; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz