Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - bitdarstellung


bucas - Mi 12.01.11 13:07
Titel: bitdarstellung
Hallo,

ich möchte die Bitdarstellung einer Integerzahl in einem String speichern? wie geht das?


Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Mi 12.01.2011 um 14:14


Bergmann89 - Mi 12.01.11 13:37

Hey,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function IntToBit(int: Integer): String;
var
  i: Integer;
begin
  SetLength(result, 32);     //Länge festlegen (32 da Integer = 32Bit);
  for i := 0 to 31 do begin  //alle 32 Bits durchzählen 
    if (int and 1) = 0 then  //wenn das letzte/niederwertigste Bit = 0 ist, dann
      result[32-i] := '0'    //0 in String schreiben
    else                     //sonst
      result[32-i] := '1';   //1 in String schreiben
    int := int shr 1;        //Int um 1 Bit nach rechts schieben
  end;
end;


MfG Bergmann.


spacemanspiff - Mi 12.01.11 13:39

Also ich kenne nur die "normalen Wege zu Fuss"...

... bitweise Und-Verknüpfung und nachsehen, ob Wert größer 0... Ja: 1 zu String hinzufügen, 0 sonst

...oder...

... Wert immer um 1 nach rechts shiften und schauen ob Wert gerade oder ungerade ist... Gerade: 1 zu String hinzufügen, 0 sonst

so sollte das klappen... wenn man eine Programmiersprache kennt. Ob es vielleicht schon was unterstützendes in Delphi gibt, kann Dir vielleicht jemand anderes sagen.

Gruß,
Thomas


elundril - Mi 12.01.11 14:34

ich glaub bei Adventgewinnspiel von vor 2 Jahren oder von letztem Jahr war eine Aufgabe dabei die sowas beinhaltete. Und soweit ich mich erinnere, hat Benny das damals ziemlich effizient mit LookUp-Tabellen gelöst. Seine Lösung muss hier irgendwo im Forum noch herumschwirren.

lg elundril


Logikmensch - Do 13.01.11 07:11

Hallo,

ich benutze meist den folgenden Weg, wenn es kein Problem darstellt, dass im Stringergebnis auch binäre Zeichen enthalten sind (Delphi-Strings kommen damit gut zurecht):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  integerstring=packed record
    case integer of
      0:(i:integer);
      1:(c:array[1..sizeof(integer)] of char);
  end;


Jetzt kann man über TypeCast aus jeder Zahl einen String machen (und auch wieder rückkonvertieren, falls nötig:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  zahl:integer;
  zeichenkette:string;
  intstr:integerstring;

begin
  //Konvertieren von Integer nach String:
  zahl := 65535;
  zeichenkette := 'Der Zahlenwert ist '+integerstring(zahl).c+' !';
  
  //Konvertieren von String zu Zahl:
  intstr.c := #255#255#0#0;
  zeichenkette := 'Der Wert war: '+inttostr(intstr.i)+' !'//65535
end;


BenBE - Do 13.01.11 07:28

Ich zitiere mal aus dem Omorphia-Source [https://omorphia.svn.sourceforge.net/svnroot/omorphia/trunk/omorphia/source/library/OIncProcs.pas]:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Function DWordToBinaryStr(AValue: DWORD): String;
Var
    B: PByte;
Begin
    Result := StringOfChar('0'32);
    B := @Byte(Result[32]);
    While AValue <> 0 Do
    Begin
        Inc(B^, AValue And 1);
        AValue := AValue Shr 1;
        Dec(B);
    End;
End;


Für die andere Richtung siehe in der Library [http://www.delphi-library.de/viewtopic.php?t=75552].