zoukankan      html  css  js  c++  java
  • javascript 中 !~ 什么意思

    快过年放假了,也终于闲下来了。每天游览于各种技术文章中,这种状态好极了。
    下午看篇关于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

    至此算是终于搞明白了。虽然总结的公式能快速得出结果,但不能解释为什么,作为技术人我们喜欢钻研,深入细节。

    感叹时间:

    正如作者的标题中所说最基本也最容易忽略的东西,混了几年连基本都没了,被人问到得贻笑大方。
    基础是一切上层的基石,潜心修道,路漫漫。

    参考文章:
    http://blog.csdn.net/zhongjling/article/details/8004103
    http://www.cnblogs.com/acheng99/archive/2009/09/02/1559037.html

  • 相关阅读:
    (笔记)Mysql命令mysqldump:备份数据库
    (笔记)Mysql命令rename:修改表名
    (笔记)Mysql命令alter add:增加表的字段
    (笔记)Mysql命令update set:修改表中的数据
    (笔记)Mysql命令delete from:删除记录
    (笔记)Mysql命令select from:查询表中的数据(记录)
    psutil库
    生成器 yield
    高阶函数map(),filter(),reduce()
    logging模块
  • 原文地址:https://www.cnblogs.com/lonny/p/4282055.html
Copyright © 2011-2022 走看看