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中Math对象使用说明
Jan 16 Javascript
JavaScript 学习历程和心得分享
Dec 12 Javascript
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 Javascript
javascript验证身份证完全方法具体实现
Nov 18 Javascript
form.submit()不能提交表单的错误原因及解决方法
Oct 13 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
javascript实现加载xml文件的方法
Nov 24 Javascript
jQuery实现本地预览上传图片功能
Jan 08 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
Jquery-data的三种用法
Apr 18 jQuery
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
Sep 04 Javascript
详解React 服务端渲染方案完美的解决方案
Dec 14 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 实用代码收集
2010/01/22 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
Python中无限元素列表的实现方法
2014/08/18 Python
python实现线程池的方法
2015/06/30 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Python实现DDos攻击实例详解
2019/02/02 Python
python实现文件的备份流程详解
2019/06/18 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
pandas参数设置的实用小技巧
2020/08/23 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
铁路个人事迹材料
2014/01/30 职场文书
简历的自我评价范文
2014/02/04 职场文书
服务之星事迹材料
2014/05/03 职场文书
企业口号大全
2014/06/12 职场文书
面试通知邮件
2015/04/20 职场文书