## Advanced concepts

#### Bitwise operations

hex = 0x12400; bin = 0b10011010; b_or = hex | bin ^ hex & bin;

- There are constant formats and bitwise operations for dealing with integers on the bit level.
- The following
*integer*constant formats are available:- Binary (base 2): begins with "0b", followed by some binary digits (0,1)
- Octal (base 8): begins with "0o", followed by some octal digits (0-7)
- Decimal (base 10): contains only decimal digits (0-9)
- Hexadecimal (base 16): begins with "0x", followed by some hexadecimal digits (0-9,a-f,A-F)

- These operators are available for doing bitwise operations:
- binary AND / AND-assign:
`&, &=`

- returns 1 if both sides are 1 - binary OR / OR-assign:
`|, |=`

- returns 1 if any side is 1 - binary XOR / XOR-assign:
`^, ^=`

- returns 1 if either side is 1, but not both - unary NOT:
`~`

- inverts bits - left shift / left shift-assign:
`<<, <<=`

- move all bits to the left (more significant positions) - right shift / right shift-assign:
`>>, >>=`

- move all bits to the right (less significant positions)

- binary AND / AND-assign:

*The main difference from other languages is that the integer type by default is 64 bits long. Left/right shift rules are equal to those of the C language. Thus, it is safe to use only shift distances between 0 and 63.*

Truth tables for AND/OR/XOR operations

AND | 0 | 1 | OR | 0 | 1 | XOR | 0 | 1 | ||
---|---|---|---|---|---|---|---|---|---|---|

0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | ||

1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |