Swift Bitwise operators allow you to perform operations on the binary form of numbers. You can specify a binary literal by prefixing the number with
0b, so for example
0b110 is equivalent to the binary number 110 (the decimal number 6). Each 1 or 0 is a bit in the number.
var number: UInt8 = 0b01101100 let newNumber = ~number // newNumber is equal to 0b01101100
Here, each bit get changed to its opposite. Declaring the number as explicitly
UInt8 ensures that the number is positive (so that we don't have to deal with negatives in the example) and that it is only 8 bits. If
0b01101100 was a larger UInt, there would be leading 0s that would be converted to 1s and become significant upon inversion:
var number: UInt16 = 0b01101100 // number equals 0b0000000001101100 // the 0s are not significant let newNumber = ~number // newNumber equals 0b1111111110010011 // the 1s are now significant
var number = 0b0110 let newNumber = number & 0b1010 // newNumber is equal to 0b0010
Here, a given bit will be 1 if and only if the binary numbers on both sides of the
& operator contained a 1 at that bit location.
var number = 0b0110 let newNumber = number | 0b1000 // newNumber is equal to 0b1110
Here, a given bit will be 1 if and only if the binary number on at least one side of the
| operator contained a 1 at that bit location.
Bitwise XOR (Exclusive OR)
var number = 0b0110 let newNumber = number ^ 0b1010 // newNumber is equal to 0b1100
Here, a given bit will be 1 if and only if the bits in that position of the two operands are different.
For all binary operations, the order of the operands makes no difference on the result.