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 25

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'