# Expressions And Operators: Bitwise Operators

Hack provides a range of bitwise operators. These assume that their operands are `int`.

## Bitwise AND

The operator `&` performs a bitwise AND on its two `int` operands and produces an `int`. For example:

``````0b101111 & 0b101                        // result is 0b101

\$lcase_letter = 0x73;                   // lowercase letter 's'
\$ucase_letter = \$lcase_letter & ~0x20;  // clear the 6th bit to make uppercase letter 'S'
``````

## Bitwise OR

The operator `|` performs a bitwise OR on its two `int` operands and produces an `int`. For example:

``````0b101111 | 0b101                      // result is 0b101111

\$ucase_letter = 0x41;                 // uppercase letter 'A'
\$lcase_letter = \$ucase_letter | 0x20; // set the 6th bit to make lowercase 'a'
``````

## Bitwise XOR

The operator `^` performs a bitwise XOR on its two `int` operands and produces an `int`. For example:

``````0b101111 ^ 0b101  // result is 0b101010
``````

## Shifting

The operator `<<` performs a bitwise left shift. It takes two `int` operands and produces an `int`.

`e1 << e2` shifts `e1` left by `e2` bits, zero extending the value.

``````0b101 << 2     // result is 0b10100
10 << 3        // result is 80
``````

The operator `>>` performs a bitwise right shift.

``````0b1011 >> 2    // result is 0b10
100 >> 2       // result is 50
``````

Note that right shifts extend the sign bit:

``````(1 << 63) >> 63 // result is -1
``````

This is because `1 << 63` is 0x8000000000000000, or -9223372036854775808.

## Bitwise Negation

The operator `~` performs a bitwise negation on its `int` operand and produces an `int`. For example:

``````\$lLetter = 0x73;                 // lowercase letter 's'
\$uLetter = \$lLetter & ~0b100000; // clear the 6th bit to make uppercase letter 'S'
``````