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

基本概念:

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

计算规则为:

~x = -(x+1);

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


解释:

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

  • 计算机中的数字是以补码的形式表示的
  • 正数的原码、反码、补码都一样,就是它本身
  • 负数的反码符号位不变,其余取反;补码为反码加1
  • +0的补码和-0一样(其实不一样,-0的进1被丢弃了)
  • 取反的意思每位0变1、1变0
操作数-11
原码10000000,00000000,00000000,0000000100000000,00000000,00000000,00000001
反码11111111,11111111,11111111,1111111000000000,00000000,00000000,00000001
补码11111111,11111111,11111111,1111111100000000,00000000,00000000,00000001
取反00000000,00000000,00000000,0000000011111111,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,就是真值啊!很简单,代码就不写了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值