PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitoperatoren,



Tyrald
05.11.2010, 15:18
Hallo Leute!

Will zwei BMPs als Layer übereinanderlegen. das obere hat ne Transparenzmaske.

Irgendwie verknotet sich mein Hirn bei dem Versuch diese Aufgabe zu lösen:

data_a soll data_b überschreiben, aber nur da, wo in maske eine 1 steht!

uint8_t maske = 0b01111000;
uint8_t data_a = 0b01011000;
uint8_t data_b = 0b10101010;

data_b = ?="§$)(data_a)?§$=)"§(maske)=$)("§$
Ergebniss data_b: = 01011010

Ist sicher ganz einfach, aber ich komm einfach nicht drauf, weil meine Hirnsynapsen die Bitoperatoren noch nicht ganz gecheckt haben...

TobiKa
05.11.2010, 15:34
Ich gehe mal davon aus das es sich um C handelt.
Eventuell so?
data_b ^= maske & data_a;

Edit:
Ach nee, dann nimmt er die Nullen nicht mit

kehrblech
05.11.2010, 17:05
vielleicht so:
data_b = (data_b & (~maske)) | (data_a & maske)

bei data_b werden alle Bits, bei denen die Maske auf 1 ist, gelöscht, bei data_a genau andersherum. Ich habe jetzt allerdings nicht überprüft, ob es wirklich funktioniert.

Viele Grüße,
Jan

TobiKa
05.11.2010, 17:48
@Jan
So passt das erste Bit nicht.

kehrblech
05.11.2010, 18:06
Wieso sollte gerade das erste Bit nicht passen?

Meine Variante liefert zu den Werten
uint8_t maske = 0b01111000;
uint8_t data_a = 0b01011000;
uint8_t data_b = 0b10101010;
das Ergebnis 0b11011010.

Das stimmt zwar nicht mit dem von Tyrald genannten (0b01011010) überein, aber das Bit an erster Stelle ist in der Maske 0, b wird an dieser Stelle also nicht von a überschrieben, bleibt also 1.

Tyrald
05.11.2010, 18:11
also aufm taschenrechner funzt das! :-D kanns aber erst später testen: grad nicht zu hause!

ich hab mich vertippt bei meinem ersten bit!

Also vielen Dank!

Tyrald
05.11.2010, 18:15
kennt noch jemand nen tollen link mit ner sammlung Bitoperator tricks??
Ein paar findet man ja in Büchern... Manchmal sieht man was geschicktes in anderem Source-Code...

also sowas:
multiplikation/division mit >> und <<
oder:
niederwertigstes bit löschen... mit data & (data+1)

usw.

TobiKa
05.11.2010, 18:25
Wieso sollte gerade das erste Bit nicht passen?
Ich meinte das es nciht zu dem von Tyrald gewünschten Ergebniss führt. Aber wie ich das sehe ist das Ergebnis aus dem ersten Post falsch und dein Ergebnis richtig.