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分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 Javascript
利用JQuery实现datatables插件的增加和删除行功能
Jan 06 Javascript
vue-ajax小封装实例
Sep 18 Javascript
webpack4的迁移的使用方法
May 25 Javascript
vue引入axios同源跨域问题
Sep 27 Javascript
基于vue写一个全局Message组件的实现
Aug 15 Javascript
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
详解微信小程序动画Animation执行过程
Sep 23 Javascript
echarts实现晶体球面投影的实例教程
Oct 10 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
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
Symfony查询方法实例小结
2017/06/28 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
jQuery 使用手册(五)
2009/09/23 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
python求素数示例分享
2014/02/16 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
解决方案设计综合面试题
2015/08/31 面试题
美发活动策划书
2014/01/14 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
退休感言
2014/01/28 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
决心书标准格式
2014/03/11 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
Python实现位图分割的效果
2021/11/20 Python
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js