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的history历史记录插件
Dec 11 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
js的hasownproperty使用示例
Mar 02 Javascript
基于javascript实现tab切换特效
Mar 29 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
详解jquery选择器的原理
Aug 01 jQuery
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
angularjs数组判断是否含有某个元素的实例
Feb 27 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
详解vue组件之间的通信
Aug 30 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php的hash算法介绍
2014/02/13 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python基于Tkinter实现的记事本实例
2015/06/17 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
python实现电脑自动关机
2018/06/20 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
年级组长自我鉴定
2014/02/22 职场文书
租房协议书
2014/09/12 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
保研导师推荐信
2015/03/25 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
用python自动生成日历
2021/04/24 Python