← Back to JavaScript Course | Chapter 1: Basics & Syntax | Lesson 12 of 12

JS Bitwise Operators

Picture a row of light switches on a wall, each one either on or off; bitwise operators let you flip, combine, and compare those switches directly, one bit at a time, instead of working with the number as a whole. They're used far less often than everyday arithmetic operators, but they're essential for tasks like packing multiple true/false flags into a single number efficiently.
Syntax
javascript
a & b
a | b
a ^ b
~a
a << n
a >> n
a >>> n

AND, OR, XOR

The & (AND) operator sets a result bit to 1 only when both operand bits are 1, | (OR) sets it to 1 when either bit is 1, and ^ (XOR) sets it to 1 only when the bits differ.

JavaScript converts both operands to 32-bit integers before applying these operators, then converts the result back to a regular number.

Example: AND, OR, XOR

javascript
console.log(5 & 3);  // 1 - AND
console.log(5 | 3);  // 7 - OR
console.log(5 ^ 3);  // 6 - XOR

NOT and Two's Complement

The ~ (NOT) operator flips every bit of its operand, and because JavaScript represents negative numbers using two's complement, ~n always equals -(n + 1).

XOR (^) is often used alongside NOT for toggling specific bits on or off without affecting the others.

Example: NOT and Two's Complement

javascript
console.log(~5); // -6, two's complement: -(5 + 1)

Left Shift and Right Shift

The << (left shift) operator moves bits left and fills with zeros, which has the effect of multiplying by a power of two, while >> (right shift) moves bits right, dividing by a power of two and preserving the sign of negative numbers.

Both are fast alternatives to multiplication or division by powers of two.

Example: Left Shift and Right Shift

javascript
console.log(4 << 1); // 8 - multiply by 2
console.log(4 >> 1); // 2 - divide by 2
console.log(-8 >> 1); // -4, sign preserved

Unsigned Right Shift

The >>> (unsigned right shift) operator also shifts bits right, but it always fills the vacated bits with zeros regardless of sign, which means it treats negative numbers as large positive numbers instead of preserving their sign.

This makes it behave differently from >> specifically on negative operands.

Example: Unsigned Right Shift

javascript
console.log(-1 >> 1);  // -1, sign preserved
console.log(-1 >>> 1); // large positive number, sign not preserved

Practical Bit Flags

A common real-world use of bitwise operators is packing several true/false settings into a single number, where each bit represents one flag, using OR to combine flags and AND to check if a specific flag is set.

This pattern shows up in permission systems, game state, and low-level protocol handling where memory efficiency matters.

Example: Practical Bit Flags

javascript
const READ = 1;    // 0b001
const WRITE = 2;   // 0b010
const EXECUTE = 4; // 0b100
let permissions = READ | WRITE; // combine flags
console.log((permissions & WRITE) !== 0); // check if WRITE is set
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
Common Mistakes
  1. Using & or | where you meant && or ||, which works on bits and returns numbers, not booleans.
  2. Forgetting that bitwise operators convert values to 32-bit integers, so large numbers or decimals are truncated or wrap around.
  3. Expecting ~5 to be -5, when ~x equals -(x + 1), so ~5 is -6.
Chapter Summary
  • JavaScript can be added to a page and displays output in different ways.
  • Statements, syntax, comments, and variables (let and const) form the basic structure.
  • Operators and comparisons, including bitwise operators, work with values.
🔒

Chapter Quiz — Complete all 12 topics to unlock

0/12 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.