按位取反运算符 ~

概念

按位取反是指将一个二进制数的每一位都取反,即 0 变为 1,1 变为 0。在很多编程语言中,可以通过使用位运算符~来实现按位取反操作。

运算规则

  1. 将要取反的二进制数转换为二进制补码表示法。
  2. 对二进制补码表示法的每一位进行取反操作。
  3. 将取反后的二进制数转换回十进制表示法。

示例

对二进制数 10110101 按位取反,可以按照以下步骤进行操作:

  1. 将 10110101 转换为二进制补码表示法,因为它是一个有符号数,所以它的最高位为 1,表示负数。其补码为 01001011。
  2. 对补码的每一位进行取反操作,得到 10110100。
  3. 将取反后的二进制数转换回十进制表示法,得到 148。

因此,按位取反操作后,二进制数 10110101 变为了十进制数 148。

应用 indexOf

由于 -1 的取反操作等于 0,而其他数的取反操作不等于 0。所以用 indexOf 操作符可以用~操作来判断某个数组字符串里是否有某个字符。
取反之后不为零,说明 indexOf 的结果不等于-1,数组字符串里包含对应字符
取反之后为零,说明 indexOf 的结果等于-1,数组字符串里不包含对应字符

1
2
3
console.log(~-1); // 0
console.log(~1); // -2
console.log(~0); // -1

数组

1
2
3
4
5
6
let arr = [0, 1, 2, 3, 4, 5, 6];
if (~arr.indexOf(0)) {
console.log("arr里包含0"); // √
} else {
console.log("arr里不包含了0");
}

字符串

1
2
3
4
5
6
let str = "123456";
if (~str.indexOf(0)) {
console.log("str字符串里包含0");
} else {
console.log("str字符串里不包含0"); // √
}