& (AND), | (OR), ^ (XOR), ~ (NOT), <<, >> (sign-preserving) and >>> (zero-filling) convert their operands to 32-bit integers, so 2 ** 31 | 0 wraps to a negative number and ~~3.7 truncates to 3. Their main use is packing boolean flags into one number.
const READ = 0b001, WRITE = 0b010, EXEC = 0b100;
let perms = READ | WRITE; // set two flags
console.log(perms.toString(2), (perms & WRITE) !== 0, (perms & EXEC) !== 0);
perms &= ~WRITE; // clear WRITE
perms ^= EXEC; // toggle EXEC
console.log(perms.toString(2), -9 >> 2, -9 >>> 28, 2 ** 31 | 0, ~~3.7);11 true false 101 -3 15 -2147483648 3
Numbers outside the 32-bit range wrap silently; use BigInt (1n << 40n), which supports every bitwise operator except >>>.