__Appendix 2 - Logical
Operators__

This section explains the logic behind the various logical operators such as OR, XOR, AND. These operators basically compare the bits of two operands in various ways.

__Xor__

Xor stands for eXclusive OR. Basically it compares bits in the
two operands with this in mind: "One or the other, but not
both". What this means is that when comparing 2 bits, if one
of them is 1, so long as the other is not also 1, the result will
be 1. However, if both are 1, the result is 0. And if both are 0,
the result is still 0, since both are the same.

This table may help. You'll see them throughout this section:

Bits of operand 1 | 1010 |

Bits of operand 2 | 1100 |

Result | 0110 |

I know it's a little out there, but that shows an example xor
instruction. Following this logic though, we can see why XORing a
register with itself produces a 0. For example, lets xor al when
it contains 141

AL | 10001101 |

AL | 10001101 |

Result | 00000000 |

Because 0 xor 0 = 0, and 1 xor 1 = 0, there's no possible way
that XORing something with itself would not equal 0.

Another use is toggling a bit or bits in a number. Watch what
happens when we take the bit 0 and xor it 5 times:

0 xor 1 = 1

1 xor 1 = 0

0 xor 1 = 1

1 xor 1 = 0

0 xor 1 = 1

And so on. We can do the same with a whole number. Whichever bits
you want toggled like we just did, XOR them with 1.

__And__

The logic behind AND is that in the
result, only bits matched with themselves will turn out. See this
table for example:

Bits of operand 1 | 1010 |

Bits of operand 2 | 1100 |

Result | 1000 |

In the first bit, 1 was matched with itself, so the resulting
bit is 1. However, 1 & 0 are not the same, so the result is 0.

__Or__

This is called an "inclusive OR". It basically means
"if one OR the other is 1, the result is 1". So, the
only way for a bit in the result to be 0 is if both bits are 0 in
the operands

Bits of operand 1 | 1010 |

Bits of operand 2 | 1100 |

Result | 1110 |