Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl (https://www.delphipraxis.net/8519-umrechnen-bin-dez-dez-bin-ohne-shr-oder-shl.html)

Evian 6. Sep 2003 19:22


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]

Evian 6. Sep 2003 20:51

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.

Luckie 6. Sep 2003 20:54

Re: Frage zu Pascal
 
Delphi-Quellcode:
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;
Und was bekomme ich jetzt dafür, dass ich anderer Leute die hausaufgaben mache? :roll:

Evian 6. Sep 2003 21:20

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?

Luckie 6. Sep 2003 21:22

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.

Evian 6. Sep 2003 21:25

Re: Frage zu Pascal
 
was genau mach shr, vielleich kann ich das ja anders umsetzen?

Luckie 6. Sep 2003 21:28

Re: Frage zu Pascal
 
Es verschiebt die Bits um angegeben Anzahl von Bits nach rechts.

Evian 6. Sep 2003 21:37

Re: Frage zu Pascal
 
Mh... schade, das hilft mir auch nicht weiter.. ich denke, dass kann ich so einfach in Pascal auch nichte realisieren. :(

Luckie 6. Sep 2003 21:40

Re: Frage zu Pascal
 
Dann implementier den Algorithmus, wie man es auch von Hand machen würde:
Code:
15 / 2 = 7 R1
 7 / 2 = 3 R1
 3 / 2 = 1 R1
 1 / 2 = 0 R1
Der Rest von Oben nach untengelesen ergibt die Zahl im Binärsystem.

Luckie 6. Sep 2003 22:07

Re: Frage zu Pascal
 
Weil mir langweilig war:
Delphi-Quellcode:
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 das war wohl auch Sinn der Aufgabe, diesen Algorithmus umzusetzten. shr hätte wohl das Thema sowieso verfehlt.

Und was bekomme ich jetzt, außer einen feuchten Händedruck und dass dein Freund meine Lorbeeren einstreicht? :roll:

Evian 6. Sep 2003 22:29

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]

Luckie 6. Sep 2003 22:32

Re: Frage zu Pascal
 
Sorry, auch gerade gemerkt.
Hier die Komplettlösung - hin und zurück:
Delphi-Quellcode:
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;
Probier deinen Code doch aus.

Evian 8. Sep 2003 09:27

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

Luckie 8. Sep 2003 14:16

Re: Frage zu Pascal
 
Grundansatz ist gut. Der letzte Code ist die komplette Lösung.

Evian 8. Sep 2003 14:32

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.

sakura 8. Sep 2003 14:36

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:
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;
...:cat:...

Luckie 8. Sep 2003 14:48

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.

sakura 8. Sep 2003 14:55

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:
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;
...:cat:....

Luckie 8. Sep 2003 15:00

Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
 
OK. Mal sehen, ob wir noch eine Rückmeldung zwecks unserer Note bekommen. :gruebel:

Sharky 8. Sep 2003 15:47

Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
 
Zitat:

Zitat von Luckie
OK. Mal sehen, ob wir noch eine Rückmeldung zwecks unserer Note bekommen. :gruebel:

Wegen nicht erlaubter Gemeinschaftsarbeit:

fünf -> Setzen.

*gggg*

Sorry: Das musste sein :lol:

Evian 8. Sep 2003 16:31

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.

Sharky 8. Sep 2003 21:08

Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
 
Zitat:

Zitat von Evian
...jemand was zu TPascal fragt, das ergebniss von Funktionen kann da nicht mit Result angesprochen werden, sondern nur über den Funktionsnamen selbst.

Hihi....


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]

maststef 13. Nov 2003 20:18

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?

negaH 13. Nov 2003 20:34

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:
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;
Gruß hagen

maststef 13. Nov 2003 20:53

Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
 
Zitat:

Natürlich gibt es eine Mathematische Formel, nur auch diese umschreibt einen iterativen Algorithmus
Na, das ist doch schonmal was. Kann die mal bitte jemand posten, oder einen Link hinschreiben? Danke :)

nilsi76 8. Mai 2007 11:47

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

Jelly 8. Mai 2007 11:54

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

marabu 8. Mai 2007 12:02

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

nilsi76 8. Mai 2007 12:23

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.

marabu 8. Mai 2007 12:25

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.

Poldy 19. Okt 2007 15:19

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 :)

DeddyH 19. Okt 2007 17:38

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.

Poldy 21. Okt 2007 13:39

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 :)

DeddyH 21. Okt 2007 16:05

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.

Poldy 21. Okt 2007 16:25

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?

DeddyH 21. Okt 2007 16:27

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).

Poldy 21. Okt 2007 16:40

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...

DeddyH 21. Okt 2007 16:53

Re: Umrechnen Bin-Dez / Dez-Bin ohne shr oder shl
 
Zitat:

Zitat von poldy
aber wie genau muss ich dann den quellcode schreiben um die binärzahl in eine dualzahl umzuwandeln?

Das kann man natürlich nicht allgemeingültig sagen, jeder hat da eine andere Vorgehensweise. Um mein Beispiel noch einmal aufzugreifen:
Du schreibst Dir am Besten eine Funktion dafür.
Delphi-Quellcode:
function ZahlAsBinaryString(Zahl: Cardinal): String;
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.

Poldy 21. Okt 2007 16:58

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?

DeddyH 21. Okt 2007 17:06

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.
Seite 1 von 2  1 2      

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