js ~操作符(字位操作"非")详解

来源:互联网 发布:无人机网站源码 编辑:程序博客网 时间:2024/05/16 02:16

基本概念:

这是js中的一元操作符:按位取反。

计算规则为:

~x = -(x+1);

即:~-1 = 0~1 = -2


解释:

下面我将从计算机组成原理方面详细解释一下,在看懂下面表格之前要有一点基本知识:

  • 计算机中的数字是以补码的形式表示的
  • 正数的原码、反码、补码都一样,就是它本身
  • 负数的反码符号位不变,其余取反;补码为反码加1
  • +0的补码和-0一样(其实不一样,-0的进1被丢弃了)
  • 取反的意思每位0变1、1变0
操作数 -1 1 原码 10000000,00000000,00000000,00000001 00000000,00000000,00000000,00000001 反码 11111111,11111111,11111111,11111110 00000000,00000000,00000000,00000001 补码 11111111,11111111,11111111,11111111 00000000,00000000,00000000,00000001 取反 00000000,00000000,00000000,00000000 11111111,11111111,11111111,11111110

对于操作数-1:取反结果为0这个不用解释了吧。
对于操作数1:这个取反的结果不大好看,但是我不是告诉你了么,~x = -(x+1),我们计算一下啊:~1 = -(1+1) = -2,那我们看看-2的补码吧,如果补码就是11111111,11111111,11111111,11111110那就对了,

操作数 -2 原码 10000000,00000000,00000000,00000010 反码 11111111,11111111,11111111,11111101 补码 11111111,11111111,11111111,11111110

-2的补码果然是11111111,11111111,11111111,11111110,这就是-2啊,这就是它在计算机中的表现形式啊!


拓展:

可能大家了解了这个,还是不知道哪里可以用到,那我就提醒一句:在-(x+1)中唯一能得到0的x的值为-1。这就有点意思了吧?我举一个例子,其它的留给大家再挖掘挖掘。
首先,还是了解一个概念:

抽象渗漏:在代码中暴露底层的实现细节。

比如:indexOf()这个函数大家肯定不陌生了.

  • 判断字符串“lo”是否在字符串“hello world”中可以这样写:
var a = "hello world";if(a.indexOf("lo")>=0) {    //match}

也可以这样写:

var a = "hello world";if(a.indexOf("lo")!=-1) {    //match}
  • 判断字符串“ol”是否不在字符串“hello world”中可以这样写:
var a = "hello world";if(a.indexOf("ol")<0) {    //not match}

或者:

var a = "hello world";if(a.indexOf("ol")==-1) {    //not match}

上面四种代码就是抽象渗漏。像这些0啊、-1啊之类细节就应该屏蔽掉。
怎么办呢?用~操作符啊,只要取反不是0,说明就不是-1,就是真值啊!很简单,代码就不写了。