Allereerst is het handig om even de standaard bitwise operaties te snappen. Ik weet niet of je dat al kent, maar het is heel eenvoudig. Je hebt eigenlijk 4 elementaire operaties:
[list=1]• AND
Beide bits moeten op die plek geset zijn, dus:
code:
1
2
3
4
5
| 0010
0011 AND
-----
0010
^ |
alleen op die plek zijn beide bits geset
• OR
Eén van beide bits moet geset zijn,
of beide bits. (inclusive OR):
op die twee plekken is er sprake van inclusive or.
• XOR
Eén van beide bits moet geset zijn, maar
niet beide. (exclusive OR):
Enkel op die plek is 1 van beide bits geset.
• NOT
Draai alle bits om:
so far de basiskennis.
Het is het eenvoudigst om gewoon alle bits even in constanten te zetten of macros of iets van dien aard. Vervolgens om te checken of die bepaalde bit geset is doe je een AND operatie, om een bit uit te zetten doe je een AND NOT operatie en om een bit aan te zetten doe je een OR operatie. Even in pseudocode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| define BIT_0 1
define BIT_1 1 << 1 // Left shift
define BIT_2 1 << 2
define BIT_3 1 << 3
...
define BIT_21 1 << 21
// checken of bit geset is:
if ( somevalue & BIT_3 ) {
}
// zet bit aan
somevalue = somevalue | BIT_9; // OR
// zet bit uit
somevalue = somevalue & ~BIT_1; // AND NOT
// flip bit (0 wordt 1, 1 wordt 0)
somevalue = somevalue ^ BIT_22; // XOR
// checken of meerdere bits geset zijn
if ( ( somevalue & (BIT_1 | BIT_3) ) == (BIT_1 | BIT3) ) {
} |
Dan is het natuurlijk niet onverstandig om de constanten ook even duidelijke namen te geven. Let overigens ook op alignment van de variabelen. De constanten moeten zelf een even grote bitlength (of aantal bytes) hebben als waarmee je de constanten wilt gaan gebruiken (3 bytes in dit geval, wat waarschijnlijk uitdraait op een 4 byte waarde) die uiteraard gepad is met nullen.
offtopic:
Overigens: als je dit in een database wilt gaan zetten wil ik je aanraden van bitwise af te stappen en met n:m relaties te gaan werken. Da's namelijk een stuk beter onderhoud- en schaalbaar.