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.
Bitwise NOT ~
:
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
Bitwise AND &
:
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.
Bitwise OR |
:
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.