Hilfe bei bitweiser Manipulation einer Variable

Gast #2845710
Lesenswert?

Hallo Leute!

Ich brauche mal eure Hilfe. Ich habe eine 16Bit breite Variable, welche 
ein Reihe vom Flags beeinhaltet. Jetzt möchte ich nur einzelne Bits 
dieser Variable ändern, indem ich an eine Funktion einen neuen Wert 
schicke.

Beispiel (pseudo-Code):
1
flags: 0010 1000 1101 0010
Die letzten vier Bits sind jetzt die Stellen, die ich manipulieren will. 
Ziel ist es, per Funktion
1
void change_bits( 0x0004 | 0x0001 );
eben nur diese letzten vier Bits auf den neuen Wert zu setzen, sodass am 
Ende
1
flags: 0010 1000 1101 0101
herauskommt.

Aber wie verknüpfe ich das? So geht es zumindest schonmal nicht:
1
void change_bits( uint16_t new_flags )
2
{
3
  flags &= (new_flags & 0x000F);
4
}

Da ist dann alles weg, was auch klar ist. Aber ich komme nicht auf die 
richtige Verknüpfung.

Kann einer helfen?
[/c]
#2845719
Lesenswert?

Hans schrieb:
> Jetzt möchte ich nur einzelne Bits
> dieser Variable ändern

Erst mit dem Negat der zu beeinflussenden Bits ver-&-en, damit die bits 
Fallen, denen du einen neuen Wert zu weisen willst.
Zweitens dann die entsprechenden Bits drauf-Odern.

Mit einer Funktion, die eine einzige Variable nimmt, geht das nicht, du 
musst zusätzlich eine Maske mitliefern. Woher soll die Funktion sonst 
wissen, dass eine 0 aktiv gesetzt werden soll oder nur so belassen 
werden soll, wie sie ist.

Alternativ kannst du auch zwei Masken übergeben: zu löschende und zu 
setzende Bits.

mfg mf
#2845993
Lesenswert?

Hans schrieb:
> es gibt vielleicht eine super ver-und/oderung,
> welche es direkt bewerkstelligt

Nein, die kann es aus mathematischer Sicht nicht geben. Es gibt drei 
Zustände pro Binärem Digit der Eingangsvariable, die die Operation, die 
du ausführen willst, vollständig notieren:
1. Bit auf 0 setzen
2. Bit auf 1 setzen
3. Bit lassen wie es ist
Das ist trinär , lässt sich also nicht in einer Binärzahl gleicher 
Stellenanzahl ausdrücken.

Weil eh 2 Bits verwendet werden, bleibt noch eine Möglichkeit übrig:
4. Bei einem JK-Flipflop gibt es noch Toggeln

mfg mf
#2846000
Lesenswert?

Hans schrieb:
> Ich habe jetztflags &= ~BITMASKE;
> flags |= neuer_wert;
>
> Passt, danke! Dachte nur, es gibt vielleicht eine super ver-und/oderung,
> welche es direkt bewerkstelligt.

Mini Float schrieb:
> Nein, die kann es aus mathematischer Sicht nicht geben.

Nichtsdestotroz kann man dies natürlich auch in eine Anweisung setzen:
1
flags = (flags & ~BITMASKE) | neuer_wert;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren