javascript操作符"!~"详解


Posted in Javascript onFebruary 10, 2015

快过年放假了,也终于闲下来了。每天游览于各种技术文章中,这种状态好极了。

下午看篇关于js的文章,其中有如下这么一段引起了我的注意。

(function () {

    var names = [];

    return function (name) {

        addName(name);

    }

    function addName(name) {

        if (!~names.indexOf(name))//如果存在则不添加

            names.push(name);

        console.log(names);// ["linkFly"]

    }

}())('linkFly');

if (!~names.indexOf(name)) 中的操作符"!~" 什么意思,不理解,先从~入手。

测试可以得出结果值有这个的规律 -(X+1)

搜索一番,有的文章只丢一句:按二进制位取反

从字面意思,这里用八位二进制表示:3=00000011,那~3=11111100,套上面公式不对呀。
上面解释还是太过抽象不具体。其实这涉及到原码、反码、补码的知识。

原码
原码表示法最高位为符号位,该位为0表示正数,1表示负数。其余位表示数的绝对值。
反码
对于一个带符号的数来说,正数的反码与其原码相同;负数的反码为其原码除符号位以外的各位按位取反。反码常用来做求补码过程中的中间形式。
补码
正数的补码与其原码和反码相同;负数的补码是对它的原码除符号位以外各位取反,并在末位加1而得到,即为该数的补码加1。计算机内的数一般以补码形式表示。在补码中用(-128)D代替了(-0)D,注意:(-128)D没有相对应的原码和反码,(-128)D = (1000,0000)B。
求补运算
求补运算不考虑符号位,对它的原码各位取反,并在末位加1而得到。对一个数进行求补运算所得的是该数相反数的补码。

拿作者文章例子,理解下

~是按位取反的意思,取反就是如果是00111,则变为11000 (按位取反)

57的二进制表示为(1个字节):00111001
按位取反后(~57)的二进制: 11000110 此表示为十进制:-70
这是一个负数,是有符号的数,负数在计算机里要用其补码来表示:补码=符号位以后按位取反再加1.
所以-70(11000110)符号位以后按位取反后为(10111001) 再加1 则为(10111010)
换成十进制为:-58
因此~57=-58

至此算是终于搞明白了。虽然总结的公式能快速得出结果,但不能解释为什么,作为技术人我们喜欢钻研,深入细节。

感叹时间:

基础是一切上层的基石,潜心修道,路漫漫。

以上就是本文的全部内容了,希望大家能够有所得。

Javascript 相关文章推荐
JavaScript window.setTimeout() 的详细用法
Nov 04 Javascript
jQuery 事件的命名空间简单了解
Nov 22 Javascript
js实现连个数字相加而不是拼接的方法
Feb 23 Javascript
jQuery 重复加载错误以及修复方法
Dec 16 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
轻松掌握JavaScript中介者模式
Aug 26 Javascript
BootStrap网页中代码显示用法详解
Oct 21 Javascript
vue项目部署上线遇到的问题及解决方法
Jun 10 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 Javascript
JavaScript forEach中return失效问题解决方案
Jun 01 Javascript
JavaScript中的标签语句用法分析
Feb 10 #Javascript
jquery动态添加删除(tr/td)
Feb 09 #Javascript
javascript模拟map输出与去除重复项的方法
Feb 09 #Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 #Javascript
jquery动态改变div宽度和高度
Feb 09 #Javascript
angularJS结合canvas画图例子
Feb 09 #Javascript
jquery实现上下左右滑动的方法
Feb 09 #Javascript
You might like
德生PL330的评价与改造
2021/03/02 无线电
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
关于JS中的闭包浅谈
2013/08/23 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
Python自动扫雷实现方法
2015/07/25 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
后勤主管岗位职责
2014/03/01 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
抗震救灾标语
2014/06/26 职场文书
争先创优活动总结
2014/08/27 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
保外就医申请书范文
2015/08/06 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript