按位非 (~)

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

按位非 (~) 運算子返回一個數字或 BigInt,其二進位制表示中,運算元對應位為 0 的位位置上為 1,否則為 0

試一試

const a = 5; // 00000000000000000000000000000101
const b = -3; // 11111111111111111111111111111101

console.log(~a); // 11111111111111111111111111111010
// Expected output: -6

console.log(~b); // 00000000000000000000000000000010
// Expected output: 2

語法

js
~x

描述

~ 運算子針對兩種型別的運算元進行了過載:數字和 BigInt。對於數字,該運算子返回一個 32 位整數。對於 BigInt,該運算子返回一個 BigInt。它首先將運算元強制轉換為數值並測試其型別。如果運算元成為 BigInt,則執行 BigInt 按位非操作;否則,它會將運算元轉換為32 位整數並執行數字按位非操作。

該運算子在運算元的二進位制補碼位表示上進行操作。該運算子應用於每個位,並按位構造結果。

NOT 運算的真值表是

x NOT x
0 1
1 0
 9 (base 10) = 00000000000000000000000000001001 (base 2)
               --------------------------------
~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)

對任何 32 位整數 x 進行按位非操作都會得到 -(x + 1)。例如,~-5 得到 4

超過 32 位的數字將丟棄其最高有效位。例如,以下超過 32 位的整數將被轉換為 32 位整數

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

警告:你可能會看到人們使用 ~~ 來將數字截斷為整數。對任何數字 x 兩次進行按位非操作會返回轉換為 32 位整數的 x,這還會移除超出 -2147483648 到 2147483647 範圍的數字的前導位。請改用 Math.trunc()

對於 BigInt,沒有截斷。從概念上講,將正 BigInt 理解為具有無限數量的前導 0 位,將負 BigInt 理解為具有無限數量的前導 1 位。

示例

使用按位非

js
~0; // -1
~-1; // 0
~1; // -2

~0n; // -1n
~4294967295n; // -4294967296n

規範

規範
ECMAScript® 2026 語言規範
# sec-bitwise-not-operator

瀏覽器相容性

另見