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 相关文章推荐
JS 控制CSS样式表
Aug 20 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
Jan 27 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
Nov 18 Javascript
javascript实现下雪效果【实例代码】
May 03 Javascript
JS未跨域操作iframe里的DOM
Jun 01 Javascript
jquery实现数字输入框
Feb 22 Javascript
微信小程序 页面跳转如何实现传值
Apr 05 Javascript
Vue实例中生命周期created和mounted的区别详解
Aug 25 Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
webpack的移动端适配方案小结
Jul 25 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入门之连接mysql数据库的一个类
2012/04/21 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
String和StringBuffer的区别
2015/08/13 面试题
生产厂厂长岗位职责
2013/12/25 职场文书
村干部承诺书
2014/03/28 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
毕业典礼邀请函
2015/01/31 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python