基本概念:
这是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,就是真值啊!很简单,代码就不写了。