Thema: Delphi Nur 5 Bit kopieren

Einzelnen Beitrag anzeigen

Assarbad
(Gast)

n/a Beiträge
 
#4

Re: Nur 5 Bit kopieren

  Alt 5. Dez 2004, 21:40
Tach Post,

nimm dir mal den CALC.EXE (Windows-Rechner) von MS "zur Hand".

Jetzt überlegst du, welche Bits du kopieren willst. Sagen wir mal Bit 2 bis 6 (Achtung, die Zälung beginnt bei 0 als niederwertigstem Bit).

In Calc würdest du also in Binärmodus (und Word!!!) schalten und 1111100 eingeben (eben Bit 2 - 6 auf 1 gesetzt).
Danach wandelst du es in eine Hexadezimalzahl: $7C in unserem Fall.

Willst du nun die entsprechenden Bits kopieren, ohne daß Verluste der anderen Bits im Zieloperanden wichtig sind, dann machst du es wie oben beschrieben. Willst du aber nur diese 5 Bits kopieren und alle anderen erhalten, mußt du einen anderen Weg beschreiten. Grundlage bleibt jedoch der Code von Jens.

Nehmen wir an, a und b sind vom Typ Word. Desweiteren wollen wir wie oben geschrieben die Bits 2-6 kopieren aus b nach a, jedoch sollen die nicht betroffenen restlichen 11 Bits in a unangetastet bleiben. Unangetastet ist zuviel gesagt, da dies nicht geht. ABER wir können die Informationen dieser Bits erhalten:

a := (a and (not $7C)) or (b and $7C); Wie man sehen kann, ist der zweite Teil ("b and $7C") entsprechend Jens' Ausführungen. Dabei "maskieren" wir b so aus, daß alle Bits außer den 5 zu kopierenden Null werden!

Der erste Teil macht etwas ähnliches. Da wir aber "not $7C" haben, werden in a die 5 entsprechenden zu den zu kopierenden Bits auf Null gesetzt. Danach wird mit einem logischen "oder" eine Verknüpfung der beiden "Masken" vorgenommen.

Machen wir es anschaulich mit einzelnen Bits (Binärdarstellung).

Code:
a      = 0101010101010101
b      = 1110001110001110
$7C    = 0000000001111100 <- konstant
not $7C = 1111111110000011 <- konstant
Code:
Teil1 = a and (not $7C) = 0101010101010101 and 1111111110000011
Übereinander geschrieben ((1 and 1) = 1; (1 and 0) = (0 and 1) = (0 and 0) = 0 - also wird das Ergebnis nur dann 1, wenn beide Werte an der Bitposition eine 1 haben):
Code:
  0101010101010101
& 1111111110000011
= 0101010100000001
Code:
Teil2 = b and $7C = 1110001110001110 and 0000000001111100
Das gleiche für b and $7C:
Code:
  1110001110001110
& 0000000001111100
= 0000000000001100
Code:
a = Teil1 or Teil2
... danach werden beide "Zwischenergebnisse" per logischem ODER verknüpft:
Code:
  0101010100000001
| 0000000000001100
= 0101010100001100
Wie man sieht, bleiben die Bits aus dem ursprünglichen a so erhalten und die 5 zu kopierenden von b überschreiben die alten 5 entsprechenden Bits aus a:

Farbkodiert (rot = alt aus a; grün = neu aus b): 0101010100001100

Das Prinzip bleibt das gleiche, egal ob man mit Byte, Word oder DWORD (oder noch größer) arbeitet. Übrigens ist Byte tatsächlich die kleinste zusammenhängende Einheit, die modifiziert werden kann. Der Rest (Bits) muß auf Umwegen geschehen.

Die Klasse Delphi-Referenz durchsuchenTBits könnte dir übrigens evtl. helfen

Übrigens erlaubt VC die Deklaration von sog. "Bit fields", welche allerdings auch mindestens die Größe des jeweils größeren integralen Typs (i.e. Byte, Word, DWORD) haben. Sie erlauben halt die einfachere Manipulation einzelner Bits, sowie Type-Castings.
  Mit Zitat antworten Zitat