Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Binär in Hexadizmal (https://www.delphipraxis.net/99848-binaer-hexadizmal.html)

Arthur 18. Sep 2007 16:58


Binär in Hexadizmal
 
hallo,
könntet ihr mir bitte helfen((habs erst seit paar tage :( , brauche es für die Schule :wall: )), wie man
-Dezimal in hexadezimal
-Binär in Hexadezimal
-Binär in Dezimal
-hexadezimal in binär
-hexadezimal in Dezimal
schreibt

also es sollte so aussehen wie das hier:
----------------------------
Dezimal in Binär

bin:= '';
dez:= strtoint(Edit1.text);
while dez <> 0 do
begin
R:= dez mod 2;
bin:= IntToStr(R)+bin;
dez:= dez div 2;
end;
Label1.caption:= bin;
----------------------------
mit FOR DO und While DO

inherited 18. Sep 2007 17:10

Re: Binär in Hexadizmal
 
Schau dir mal folgende Seite an, dort wird für jedes Zahlensystem erklärt wie man das umrechnet:
http://www.arndt-bruenner.de/mathe/s...lensysteme.htm

Kedariodakon 18. Sep 2007 17:13

Re: Binär in Hexadizmal
 
Dazu must du schonmal die Größe festlegen (wieviel Bytes sind eine Zahl)...

Dezimal in Hexadizimal => Delphi-Referenz durchsuchenIntToHex (Funktion)
Hexadezimal in Dezimal => teste doch mal StrToInt( '$ff' )

Damit hast du schonmal alles nötige für Hexadezimal und Dezimal, fehlt ja nur noch Binär...

Für die umwndlung in Binär brauchst du nicht viel mehr als Delphi-Referenz durchsuchenAnd und nen Vergleich ev. noch Delphi-Referenz durchsuchenShr Delphi-Referenz durchsuchenShl je nach umsetzung...

Binär in Dezimal ist auch nicht viel schwierieger, ebenfalls nur Delphi-Referenz durchsuchenShl / Delphi-Referenz durchsuchenShr und ein simples Or...

Oder universal nach dem Vorschlag von Inherited :zwinker:
Dafür brachst du dann vor allem Delphi-Referenz durchsuchenDiv und Delphi-Referenz durchsuchenMod und ein Array für die Darstellungen nach Wert...

Da solltest du dir dann aber noch Delphi-Referenz durchsuchenUpperCase, Delphi-Referenz durchsuchenLowerCase anschauen.
Für den Umgang mit dem Array brauchst du dann wohl noch Delphi-Referenz durchsuchenHigh, Delphi-Referenz durchsuchenLow und Delphi-Referenz durchsuchenLength, um es in einer Schleife benutzen zu können...

z.b.:
Delphi-Quellcode:
Const
  cDisplay: Array Of Char[ 0..15 ] = ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' );

Bye Christian

Edit: Tipfehler beseitigt (Thx Muetze1);

Muetze1 18. Sep 2007 17:39

Re: Binär in Hexadizmal
 
Zitat:

Zitat von Kedariodakon
Delphi-Quellcode:
Const
  cDisplay: Array Of Char[ 0..15 ] = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ];

Das zweite sollen runde Klammern sein und keine eckigen und es gibt davon eine Kurzform:

Delphi-Quellcode:
Const
  cDisplay: Array Of Char[ 0..15 ] = '0123456789abcdef';

Arthur 18. Sep 2007 17:45

Re: Binär in Hexadizmal
 
also so läuft es :)
:gruebel: aber nur das ich es mit einer for oder while schleife machen soll..... :gruebel:
und in der hilfe kann ich nicht nachschauen, da windows vista die nicht unterstützt..:-(

Kedariodakon 18. Sep 2007 17:47

Re: Binär in Hexadizmal
 
Zitat:

Zitat von Arthur
also so läuft es :)
:gruebel: aber nur das ich es mit einer for oder while schleife machen soll..... :gruebel:
und in der hilfe kann ich nicht nachschauen, da windows vista die nicht unterstützt..:-(

Die For / While Schleife benötigst du trotzdem...

Bye Christian

Edit:
Ich hab mal ein wenig rumgestöbert, da ich damals ganz am Anfang zu meiner Ausbildungszeit sowas programieren mußte...
Hab jetzt einfach mal das wichtigste C&P aus dem Src, ka ob das funktionstüchtig ist, auf dem ersten Blick sollte alles bei sein.


Delphi-Quellcode:
Uses
  SysUtils, Math;

Type
  TNumeralSystem = ( nsBin, nsDec, nsHex ); //  Unsere Zahlensysteme

Const
  cDisplayDigits: Array[ 0..15 ] Of Char = ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ); //  Buchstaben alle klein!

Function GetNSSize( Const NummeralSystem: TNumeralSystem ): Integer;
//**  Wieviel Zahlen hat das System
Begin
  Case NummeralSystem Of
    nsBin: Result := 2;
    nsDec: Result := 10;
    nsHex: Result := 16;
    Else   Result := -1;
  End;
End;

Function CheckNSString( Const NumeralSystemString: String; Const NummeralSystem: TNumeralSystem ): Boolean;
//**  entspricht der String der Notation des Zahlensystems (Ungültige Zeichen???)
Var i:       Integer;
    a:       Integer;
    ConvStr: String;
    IOResult: Boolean;
Begin
  Result := False;
  If Length( NumeralSystemString ) > 0 Then Begin
    ConvStr  := LowerCase( NumeralSystemString ); //  Großbuchstaben zu Kleinbuchstaben wandeln
    IOResult := False;
    For i := 1 To Length( ConvStr ) Do Begin     //  Jedes Zeichen des übergeben Strings durchgehen
      IOResult := False;
      For a := 0 To GetNSSize( NummeralSystem ) - 1 Do Begin //  cDisplayDigits durchgehen
        IOResult := ConvStr[ i ] = cDisplayDigits[ a ];
        If IOResult Then Break;  //  For Schleife abbrechen wenn Zeichen übereinstimmen
      End;
      If Not IOResult Then Break; //  Abbrechen wenn ein Zeichen nicht gefunden wurde...
    End;
    Result := IOResult;
  End;
End;

Function GetDecValue( Const aChar: Char ): Integer;
//**  Zeichen zu dezimalen Wert
Var i:       Integer;
    FoundOne: Boolean;
Begin
  Result := -1;
  For i := Low( cDisplayDigits ) To High( cDisplayDigits ) Do Begin
    FoundOne := cDisplayDigits[ i ] = aChar;
    If FoundOne Then Begin
      Result := i;
      Break;
    End;
  End;
  If Not FoundOne Then Raise EConvertError.Create( 'Wert für das Numerische Zeichen: "' + aChar + '" kann nicht ermittelt werden' );
End;                                                                                            

Function ConvertToDec( Const SrcNumStr: String; Const SrcNumSys: TNumeralSystem ): Int64;
//** Konvertiert eine Zahl eines Systems zu einer Dezimalzahl
Var ConvStr: String;
    Len:     Integer;
    i:       Integer;
    NV:      Int64;
Begin
  If SrcNumSys <> nsDec Then Begin //  Nur aufwendig konvertieren, wenn Anfangssystem nicht Dezimal
    Result := 0;
    ConvStr := LowerCase( SrcNumStr ); //  Großbuchstaben zu Kleinbuchstaben wandeln
    Len    := Length( ConvStr );
    For i := 0 To Len - 1 Do Begin  
      NV     := Trunc( IntPower( GetNSSize( SrcNumSys ), i ) );     //  passende Potentz ermitteln
      Result := Result + ( GetDecValue( ConvStr[ Len - i ] ) * NV ); //  Wert ausrechnen und zum Ergebniss hinzufügen...
    End;
  End Else Begin
    Result := StrToInt64( SrcNumStr );
  End;
End;

Function NumeralSystemConvert( Const SrcNumStr: String; Const SrcNumSys, DestNumSys: TNumeralSystem ): String;
//**  Konvertiert eine Zahl eines Systems in ein anderes Zahlensystem
Var ConvStr: String;
    DecConv: Int64;
    DestP:   Integer;
Begin
  Result := '';
  ConvStr := LowerCase( SrcNumStr ); //  Großbuchstaben zu Kleinbuchstaben wandeln
  If CheckNSString( ConvStr, SrcNumSys ) Then Begin
    If Not ( SrcNumSys = DestNumSys ) Then Begin
      Try
        DecConv := ConvertToDec( ConvStr, SrcNumSys );
        If DestNumSys <> nsDec Then Begin //  Wir haben schon ein dezimales Ergebniss, deshalb nur bei nicht dezimalen Zielsystem berechnen...
          DestP := GetNSSize( DestNumSys );
          While DecConv <> 0  Do Begin
            Result := cDisplayDigits[ DecConv Mod DestP ] + Result;
            DecConv := DecConv Div DestP;
          End;
        End Else Begin
          Result := IntToStr( DecConv );
        End;
      Except
        On Error: Exception Do Begin
          Result := 'ERROR: "' + Error.Message + '"';
        End;
      End;    
    End Else Begin
      Result := ConvStr; //  gleiches Zahlensystem brauch nicht umgewandelt werden...
    End;
  End Else Begin
    Result := 'ERROR: Zeichenfolge konnte wegen ungültiger Zeichen nicht umgerechnet werden.';
  End;
End;
Viel Spass


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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