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
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?
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.