Forum: PC-Programmierung Bits nach Maske setzen [C]


von Stefan (Gast)


Lesenswert?

Hallo,
Ich habe ein Problem mit dem setzen von Bits in C. Ich habe einen Wert 
und eine dazugehörige Maske beispielsweise:
Wert:     0001 1101 1001 1110
Maske:    0000 0000 1111 0000

Dazu habe ich einen kleinen numerischen Wert der in die Maske passt. In 
diesem Fall wären das 4 Bit, demnach ein Zahlenwert von 0 - 15 der darin 
eingefügt werden soll.

Ich kann nun also mit einem negierten AND diese Bits auf '0' setzen und 
hier nun meine Frage. Wie kann ich nun diesen kleinen Zahlenwert von 
0-15 verschieben dass er an der Stelle der Maske in den eigentlichen 
Wert eingefüllt wird?

Die Maske kann dabei in Länge und Position variieren.

Danke für eure Hilfe schon im Voraus,

Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan schrieb:
> Wie kann ich nun diesen kleinen Zahlenwert von
> 0-15 verschieben dass er an der Stelle der Maske in den eigentlichen
> Wert eingefüllt wird?

Bestimme die Nummer des niedrigsten Bits der Maske und schiebe den 
"kleinen Zahlenwert" um diese Anzahl.

(Voraussetzung ist natürlich, daß die Maske aus aufeinanderfolgenden 
Bits besteht).


Das ließe sich so erledigen:

1
uint32_t maske = 0x00f0;
2
uint32_t wert = 0xA;
3
4
for (i = 0; i < BITANZAHL; i++)
5
{
6
  if (maske & (1 << i))
7
    break;
8
  wert <<= 1;
9
}

Hier wird solange "wert" nach links geschoben, wie in "maske" Nullen 
enthalten sind.

Wirds klarer?

von Fabian O. (xfr)


Lesenswert?

Du musst in zwei Schritten vorgehen:

1.Rausfinden, an welcher Position (von rechts gesehen) die Maske, d.h. 
die erste 1, beginnt. Etwa mit einer Schleife, die eine Kopie der Maske 
in jedem Schritt um eins nach rechts schiebt, bis das unterste Bit 1 
ist. Dabei zählt sie mit, um wie viele Positionen die Maske verschoben 
wurde. Auch den Fall bedenken, dass die Maske 0 sein könnte ...

2. Im zweiten Schritt verschiebst Du die Zahl um genau diese Anzahl an 
Stellen nach links und veroderst sie mit (Zielwert & invertierter 
Originalmaske).

von Stefan (Gast)


Lesenswert?

Wunderbar hat geklappt. Vielen Dank euch zweien für die Hilfe.
Also der Ablauf in Pseudocode(OHNE SCHLEIFEN)
Drei Parameter sind gegeben: WERT, MASKE, ZWEITWERT

1: Die negierte Maske mit dem effektiven Wert "anden".
1
WERT: WERT & ~MASKE
2: Die Maske mit sich selber minus 1 "anden".
1
y: Maske & (Maske - 1)
3: Position des niedrigsten bits durch logarithmus berechnen oder in 
Log-Tabelle nachschlagen. (Welcher Logarithmus verwendet wird ist im 
unteren Beispiel egal!)
1
position: Log(~y & MASKE) / Log(2)
4: ZWEITWERT um die errechnete Position nach links shiften.
1
ZWEITWERT: ZWEITWERT << position
5: Den WERT mit dem neuen ZWEITWERT "or-en"
1
resultat: WERT | ZWEITWERT
6: Feddisch ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.