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 相关文章推荐
jQuery 如何先创建、再修改、后添加DOM元素
May 20 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
jQuery插件扩展测试实例
Jun 21 Javascript
利用jquery实现瀑布流3种案例
Sep 18 Javascript
JS多物体实现缓冲运动效果示例
Dec 20 Javascript
微信小程序 蓝牙的实现实例代码
Jun 27 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 Javascript
详解angularjs 学习之 scope作用域
Jan 15 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 Javascript
详解Vscode中使用Eslint终极配置大全
Nov 08 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
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
javascript常用的设计模式
2017/02/09 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Python中扩展包的安装方法详解
2017/06/14 Python
神经网络python源码分享
2017/12/15 Python
Python3中的bytes和str类型详解
2019/05/02 Python
python print出共轭复数的方法详解
2019/06/25 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
2015年中秋节演讲稿
2015/03/20 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书