JavaScript Bitwise Operations


JavaScript Bitwise Operators

Operator Description Example Same as Result Same as
& AND 5 & 1 0101 & 0001  1 0001
| OR 5 | 1 0101 | 0001  5 0101
~ NOT ~ 5  ~0101  10 1010
^ XOR 5 ^ 1 0101 ^ 0001  4 0100
<< Zero fill left shift 5 << 1 0101 << 1  10 1010
>> Signed right shift 5 >> 1 0101 >> 1   2 0010
>>> Zero fill right shift 5 >>> 1 0101 >>> 1   2 0010

The examples above uses 4 bits unsigned examples. But JavaScript uses 64 bits signed numbers.

Because of this (in JavaScript) ~ 5 will not return 10. It will return -6.

0000000000000000000000000000000000000000000000000000000000000101

 will return:

1111111111111111111111111111111111111111111111111111111111111010


Bitwise AND

When a bitwise AND is performed on a pair of bits, it returns 1 if both bits are 1.

One bit example:
OperationResult
0 & 00
0 & 10
1 & 00
1 & 11
4 bits example:
OperationResult
1111 & 00000000
1111 & 00010001
1111 & 00100010
1111 & 01000100

Bitwise OR

When a bitwise OR is performed on a pair of bits, it returns 1 if one of the bits are 1:

One bit example:
OperationResult
0 | 00
0 | 1
1 | 01
1 | 11
4 bits example:
OperationResult
1111 | 00001111
1111 | 00011111
1111 | 00101111
1111 | 01001111

Bitwise XOR

When a bitwise XOR is performed on a pair of bits, it returns 1 if the bits are different:

One bit example:
OperationResult
0 ^ 00
0 ^ 1
1 ^ 01
1 ^ 1
4 bits example:
OperationResult
1111 ^ 00001111
1111 ^ 00011110
1111 ^ 00101101
1111 ^ 01001011

JavaScript Bitwise Operations

JavaScript bitwise operations works on 32 bits signed integers.

Any number in a bitwise operation is converted into a 32 bit signed integer.

The result of a bitwise operation is converted back into a JavaScript number.


JavaScript Bitwise AND (&)

Bitwise AND returns 1 only if both bits are 1:

DecimalBinary
500000000000000000000000000000101
100000000000000000000000000000001
5 & 100000000000000000000000000000001 (1)

Example

var x = 5 & 1;
»

JavaScript Bitwise OR (|)

Bitwise or returns 1 if one of the bits are 1:

DecimalBinary
500000000000000000000000000000101
100000000000000000000000000000001
5 | 100000000000000000000000000000101 (5)

Example

var x = 5 | 1;
»

JavaScript Bitwise XOR (^)

Bitwise XOR returns 1 if the bits are different:

DecimalBinary
500000000000000000000000000000101
100000000000000000000000000000001
5 ^ 100000000000000000000000000000100 (4)

Example

var x = 5 ^ 1;
»

JavaScript Bitwise NOT (~)

DecimalBinary
500000000000000000000000000000101
~511111111111111111111111111111010 (-6)

Example

var x = ~5;
»

JavaScript (Zero Fill) Bitwise Left Shift (<<)

This is a zero fill left shift. One or more zero bits are pushed in from the right, and the leftmost bits fall off:

DecimalBinary
500000000000000000000000000000101
5 << 100000000000000000000000000001010 (10)

Example

var x = 5 << 1;
»

JavaScript (Sign Preserving) Bitwise Right Shift (>>)

This is a sign preserving right shift. Copies of the leftmost bit are pushed in from the left, and the rightmost bits fall off:

DecimalBinary
-511111111111111111111111111111011
-5 >> 111111111111111111111111111111101 (-3)

Example

var x = -5 >> 1;
»

JavaScript (Zero Fill) Right Shift (>>>)

This is a zero fill right shift. One or more zero bits are pushed in from the left, and the rightmost bits fall off:

DecimalBinary
500000000000000000000000000000101
5 >>> 100000000000000000000000000000010 (2)

Example

var x = 5 >>> 1;
»

Signed Numbers

Signed numbers with only one bit set is easy to understand:

Binary RepresentationDecimal value
000000000000000000000000000000011
000000000000000000000000000000102
000000000000000000000000000001004
000000000000000000000000000010008
0000000000000000000000000001000016
0000000000000000000000000010000032
0000000000000000000000000100000064

Setting a few more bits reveals the binary pattern:

Binary RepresentationDecimal value
000000000000000000000000000001015 (4 + 1)
0000000000000000000000000000110113 (8 + 4 + 1)
0000000000000000000000000010110145 (32 + 8 + 4 + 1)

JavaScript numbers are stored in two's complement format.

This means that a negative number is the bitwise NOT of the number plus 1:

Binary RepresentationDecimal value
000000000000000000000000000001015
11111111111111111111111111111011-6
0000000000000000000000000010100040
11111111111111111111111111011000-41

Converting Decimal to Binary

Example

function dec2bin(dec){
    return (dec >>> 0).toString(2);
}
»

Converting Binary to Decimal

Example

function bin2dec(bin){
    return parseInt(bin, 2).toString(10);
}
»