Laden...

Bestimmtes Bit in einem Bitfeld ersetzen?

Erstellt von zipperle vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.896 Views
Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 14 Jahren
Bestimmtes Bit in einem Bitfeld ersetzen?

Hi,

ich komm einfach nicht drauf.
Bsp:
Bitfeld1: 0001 0101
Bitfeld2: 0100 0000

Ziel: Bit6 aus Bitfeld1 mit Bit6 aus Bitfeld2 setzen = 01010101.

Bit6 aus Bitfeld1 soll in jedem Fall ersetzt werden, d.h. auch wenn z.B.
Bitfeld1=0101 0101 und
Bitfeld2=0000 0000
= 0001 0101

Mit welcher Bitoperation gelingt das für beide Beispiele? Mit AND, OR, XOR komme ich nicht auf die Lösung. Und wie sieht dann der Code in C# dazu aus?

Hoffe Ihr könnt mir helfen...

Danke!

1.130 Beiträge seit 2007
vor 14 Jahren

Bitfelder:
kombinieren:OR (|) Z.B 0001 0101|0100 0000 =01010101
überschneidungen finden, bits herausfiltern: And (&)
unterschiede finden: Xor (^)
undrehen: Not (!)
einzelnes Bit setzen: (1<<nummer)

[Artikel] Bitoperationen in C#

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo zipperle,

du brauchst eine Maske, bei der nur das sechste Bit gesetzt ist.

Mit dieser Maske löscht du das entsprechende Bit im ersten Wert (& ~)
Mit dieser Maske löscht du alle anderen Bits aus dem zweiten Wert (&)
Dann verorderst du beide Zwischenergebnisse (|)

herbivore

Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 14 Jahren

Danke für die schnellen Antworten.
So ganz sicher bin ich mir aber noch nicht. Ich versuch das von mir erst genannte Beispiel mit Herbivore´s Beschreibung:

  1. Maske: 0100 0000

  2. Bit 6 laus Bitfeld1 öschen:

  1011 1111
& 0001 0101
-----------
= 0001 0101
  1. Mit Maske Bits aus Bitfeld2 löschen:
  1011 1111
& 0100 0000
-----------
= 0000 0000
  1. Zwischenergebnisse verodern:
  0001 0101
| 0000 0000
-----------
= 0001 0101

War das so korrekt?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo zipperle,

von den Operationen her stimmt es. Die Werte, die du eingetragen hast, hauen nicht hin.

Die Maske muss in im ersten Schritt invertiert sein, im zweiten nicht.

Mit

1. Bitfeld: 0001 0101
2. Bitfeld: 0100 0010 
Maske:      0100 0000

Wären folgende Schritte nötig:

  0001 0101 (1. Bitfeld)
& 1011 1111 (invertierte Maske)
-----------
= 0001 0101

  0100 0010 (2. Bitfeld)
& 0100 0000 (Maske)
-----------
= 0100 0000

  0001 0101 (1. Zwischenergebnis)
| 0100 0000 (2. Zwischenergebnis)
-----------
= 0101 0101

herbivore

Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 14 Jahren

ah stimmt, habs endlich kapiert!

Vielen Dank!