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重建星际争霸
Dec 22 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
Jul 21 Javascript
初学Javascript的一些总结
Nov 03 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
Jul 04 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
Javascript同时声明一连串(多个)变量的方法
Jan 23 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
Sep 12 Javascript
微信小程序3种位置API的使用方法详解
Aug 05 Javascript
Nuxt v-bind绑定img src不显示的解决
Dec 05 Javascript
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
PHP中文件上传的一个问题
2010/09/04 PHP
php学习笔记之 函数声明
2011/06/09 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
非常好的js代码
2006/06/27 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
Python中交换两个元素的实现方法
2018/06/29 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
python通过http下载文件的方法详解
2019/07/26 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
详解Python中的路径问题
2020/09/02 Python
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
2014年大学生自我评价
2014/01/19 职场文书
大学生实习证明范本
2014/09/19 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
增值税发票丢失证明
2015/06/19 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python