zoukankan      html  css  js  c++  java
  • (~)按位取反符

    问题:

    ~ 运算符查看表达式的二进制表示形式的值,并执行位非运算。

    Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2; ~2 = -3;

    js取反我只知道个!,但是~为什么也叫取反,他返回的又不是boolean类型?

    ~1,~2 的二进制又不是 -2 ,-3 ,怎么会转换成这么奇怪的值?

    网友解答:

    按位取反还真和boolean没多大关系,大体流程是这样的:

    就来看看~1的计算步骤:

    • 1(这里叫:原码)转二进制 = 00000001
    • 按位取反 = 11111110
    • 发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 = 10000001
    • 末位加1取其补码 = 10000010
    • 转换回十进制 = -2

    有网友对上面的答案进行了三点补充,如下:

    • 按位取反的运算规则这么奇怪并不是JavaScript独有的,而是所有的计算机语言都是这样的。这样做的主要原因是为了为了统一减法和加法,在计算机中,减法会变成加一个负数,而负数会以补码的形式存储。而这样主要是因为补码和数字的十进制数有这么转换关系,负数:补码(x) = -x - 1,正数:补码(x) = x
    • 因为补码是针对负数存在的,那么只要数据类型有无符号数,就没有这样的烦恼了,比如C语言有无符号整型,就能对无符号整型直接按位取反。
    • 如果没有无符号类型,而且也只是想要按位取反,而不是附带补码的按位取反,需要另外的方法。让全1的数据和当前数据做按位抑或就行了。比如,你有一个32位的数据a,需要对它做按位取反,那么这样就行了:0xFFFF ^ a
    var a = 0x8321;
    console.log(a.toString(2));
    console.log((0xFFFF ^ a).toString(2));
    
    //1000001100100001
    //111110011011110   => 左边最高位是0,被隐藏了。

    下面举个例子:

    var n = -4.9;
    console.log(n); //4.9
    n = ~n;
    console.log(n);//3
    n = ~n;
    console.log(n);//4

    例2:

    var n = 4.2;
    console.log(n); //4.2
    n = ~n;
    console.log(n);//-5
    n = ~n;
    console.log(n);//4

    例3:

    var n = 4;
    console.log(n); //4
    n = ~n;
    console.log(n);//-5
    n = ~n;
    console.log(n);//4
  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/jxl-blog/p/9713295.html
Copyright © 2011-2022 走看看