Numbers can be expressed in binary like this:
3 = 000011
5 = 000101
10 = 001010
…etc. I’m going to assume you’re familiar with binary.
Bitwise AND means to take two numbers, line them up on top of each other, and create a new number that has a 1 where both numbers have a 1 (everything else is 0).
For example:
3 => 00011
& 5 => 00101
------ -------
1 00001
Bitwise OR means to take two numbers, line them up on top of each other, and create a new number that has a 1 where either number has a 1 (everything else is 0).
For example:
3 => 00011
| 5 => 00101
------ -------
7 00111
Bitwise XOR (exclusive OR) means to take two numbers, line them up on top of each other, and create a new number that has a 1 where either number has a 1 AND the other number has a 0 (everything else is 0).
For example:
3 => 00011
^ 5 => 00101
------ -------
6 00110
Bitwise NOR (Not OR) means to take the Bitwise OR of two numbers, and then reverse everything (where there was a 0, there’s now a 1, where there was a 1, there’s now a 0).
Bitwise NAND (Not AND) means to take the Bitwise AND of two numbers, and then reverse everything (where there was a 0, there’s now a 1, where there was a 1, there’s now a 0).
Continuing: why does word &= 15
set all but the 4 rightmost bits to 0? You should be able to figure it out now…
n => abcdefghjikl
& 15 => 000000001111
------ --------------
? 00000000jikl
(0 AND a = 0
, 0 AND b = 0
, … j AND 1 = j
, i AND 1 = i
, …)
How is this useful? In many languages, we use things called “bitmasks”. A bitmask is essentially a number that represents a whole bunch of smaller numbers combined together. We can combine numbers together using OR, and pull them apart using AND. For example:
int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
If I only have the map and the hat, I can express that as myInventoryBitmask = (MagicMap | MagicHat)
and the result is my bitmask. If I don’t have anything, then my bitmask is 0. If I want to see if I have my wand, then I can do:
int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
printf("I have a wand\n");
} else {
printf("I don't have a wand\n");
}
Get it?
EDIT: more stuff
You’ll also come across the “bitshift” operator: << and >>. This just means “shift everything left n bits” or “shift everything right n bits”.
In other words:
1 << 3
= 0001 << 3
= 0001000
= 8
And:
8 >> 2
= 01000 >> 2
= 010
= 2