• 按位取反运算符~


    二进制数在内存中以补码的形式存储。

    按位取反:二进制每一位取反,0变1,1变0。

    ~9的计算步骤:

    转二进制:0 1001

    计算补码:0 1001

    按位取反:1 0110

    转为原码:

    按位取反:1 1001  

    末位加一:1 1010

    符号位为1是负数,即-10

    var x = 10;

    在计算机中一个整型数4字节,1字节8位,所以数字10在计算机中存储占32位,即

    00000000 00000000 00000000 00001010,

    按位取反,得

    11111111 11111111 11111111 11110101,

    这个二进制数据就是“~10”,最高位是1表示它是个负数,那么我们如何转化为十制数呢?

    这里又涉及到了负数在计算机里的存储问题,计算机里,负数以其正值的补码形式存在。

    再举个例子:

    -10 ,二进制表示为

    10000000 00000000 00000000 00001010

    原码,取其绝对值也就是10,即

    00000000 00000000 00000000 00001010

    反码,按位取反,得

    11111111 11111111 11111111 11110101

    补码,即将反码加1,得

    11111111 11111111 11111111 11110110

    至此,我们得到了计算机中-10的二进制存储形式。

    然后我们再回到上一个问题,我们怎么根据计算机中的补码得到这个负数呢?

    我们可以按原路返回,就是将计算机中存储的二进制补码减1,然后取反,再得到原码,换成相应负数即可,不过这样有点麻烦,因为涉及到了减法操作。

    另一种方法,将负数的补码先取反,然后加1,最高位置换为1即可。

    对于~10,在计算机中存储为

    11111111 11111111 11111111 11110101   (这是10取反的结果,但却是未知数X的补码形式)

    先取反,得

    00000000 00000000 00000000 00001010   (此处,再次取反,返回10)

    再加1,得

    00000000 00000000 00000000 00001011   (10+1得11)

    最高位变1,即

    10000000 00000000 00000000 00001011   (取相反数即-11)

    结果是“-11”

    由此我们可以看出规律:“~x”的结果为“-(x+1)”

    math.abs(~2016) = 2017

    ~表示按位取反,math.abs函数表示取绝对值.

      10进制数2016,转32位2进制数为:0000 0111 1110 0000

      ~按位取反:1111 1000 0001 1111,对应十进制数:-2017

      Math.abs(-2017)=2017

    所以“~2018”就等于“-2019”,Math.abs(-2019)即2019 

  • 相关阅读:
    spring security使用数据库管理用户权限
    ubuntu安装配置jdk tomcat mysql ...
    64位虚拟机安装64位ubuntu出现问题
    maven pom文件结构详解
    Maven3下的java web项目
    数据库分页和使用jstl标签替换分页的jsp代码
    servlet生命周期
    图片校验码的生成
    HttpSessionListener和HttpSessionBindingListener监听session的销毁
    perl 处理特殊字符
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/6184874.html
Copyright © 2020-2023  润新知