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获得内容和属性方法及示例
Dec 02 Javascript
js控制分页打印、打印分页示例
Feb 08 Javascript
通过Javascript读取本地Excel文件内容的代码示例
Apr 08 Javascript
AngularJS初始化静态模板详解
Jan 14 Javascript
基于JavaScript实现熔岩灯效果导航菜单
Jan 04 Javascript
js实现随机数字字母验证码
Jun 19 Javascript
vue实现点击图片放大效果
Aug 15 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
vue.js+element-ui动态配置菜单的实例
Sep 07 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
May 03 Javascript
详解小程序如何动态绑定点击的执行方法
Nov 26 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
Feb 01 jQuery
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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
总结一些js自定义的函数
2006/08/05 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
Python批量转换文件编码格式
2015/05/17 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
python实现代码审查自动回复消息
2021/02/01 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
管理标语大全
2014/06/24 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
2015年领班工作总结
2015/04/29 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
党员反邪教心得体会
2016/01/15 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang