Thema: Delphi 0b0111 in Delphi-Sprache

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.212 Beiträge
 
Delphi 12 Athens
 
#25

Re: 0b0111 in Delphi-Sprache

  Alt 7. Nov 2003, 10:49
@Daniel B er will das ja im QuellCode zur besseren lesbarkeit nutzen.

BinToHex hilft hier ja nichts, er müsste ja sonst sowas wie BinToHex('1001010010', Hex) und dann noch HexToInt(Hex, Int) machen. Damit wird der QuellCode ja nicht gerade besser lesbarer.


Delphi-Quellcode:
(* Von Vorhin: *)
I := Bxxxx; {jeweils mit fester Bit-Anzahl}
I := Bxxxxxxxx; {4/8/16/32 Bit's}
I := Bxxxxxxxxxxxxxxxx;
I := Bxxxxxxxx_xxxxxxxx;
...
{ist der schnellte Weg - das Programm wird nicht langsamer, da keine zusätzlichen Routinen zur dekodierung eingebunden werden}

(* Mit Code 1 (siehe unten): *)
I := B(xxx); {1 - 10 Bit's}

(* Mit Code 2 (siehe unten): *)
I := B('xxx'); {1 - 32 Bit's}
Delphi-Quellcode:
(* Code 1 *)
Function B(I: LongWord): Word;
  Var A: Word;

  Begin
    Result := $00;
    A := $01;
    While I > 0 do Begin
      If I mod 10 > 0 Then Result := Result or A;
      I := I div 10;
      A := A shl 1;
    End;
  End;

(* Code 2 *)
Function B(I: String): LongWord;
  Begin
    Result := $0000;
    While I > 'do Begin
      Result := Result shl 1;
      If I[1] <> '0Then Result := Result or $0001;
      Delete(I, 1, 1);
    End;
  End;
Diese Routinen sind so geschrieben, das sie auch bei Fehleingaben (keine Binärwerte) ohne Exception durchlaufen. Sie reagieren auf Bit = '0' > 0 und Bit <> '0' > 1. Im Code 2 kommt es zum Überlauf (falscher Wert wird zurückgegen), wenn mehr als 32 Bit übergeben werden.

Es besteht noch die Möglichkeit "Code 2" so zu erweitern, das man auch Trennzeichen zur noch besseren lesbarkeit im Binärwert verwenden kann.
z.B.: I := B('xxxx xx xx');
Delphi-Quellcode:
(* Code 2 - erweitert *)
Function B(I: String): LongWord;
  Begin
    Result := $0000;
    While I > 'do Begin
      If I[1] <> ' '{Trennzeichen} Then Begin
        Result := Result shl 1;
        If I[1] <> '0Then Result := Result or $0001;
      End;
      Delete(I, 1, 1);
    End;
  End;
Und wenn jetzt noch diese Routinen überladen werden, können beide Parallel genutzt werden.
Delphi-Quellcode:
(* Code 1 *)
Function B(I: LongWord): Word; overload;
  Var A: Word;

  Begin
    Result := $00;
    A := $01;
    While I > 0 do Begin
      If I mod 10 > 0 Then Result := Result or A;
      I := I div 10;
      A := A shl 1;
    End;
  End;

(* Code 2 - erweitert *)
Function B(I: String): LongWord; overload;
  Begin
    Result := $0000;
    While I > 'do Begin
      If I[1] <> ' '{Trennzeichen} Then Begin
        Result := Result shl 1;
        If I[1] <> '0Then Result := Result or $0001;
      End;
      Delete(I, 1, 1);
    End;
  End;
Angehängte Dateien
Dateityp: exe binconst.exe (65,5 KB, 1x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat