Javascript向左位运算

javascript中向左的位运算 1 << 31 为什么结果是33位?为什么是-2147483648而不是0?

1的二进制表示为00000000000000000000000000000001,
将其向左移动31位,空位用0填充,得到的结果为10000000000000000000000000000000。
这个结果是一个32位的二进制数,从左到右第一位为符号位,表示正负性。在JavaScript中,符号为1表示负数,所以这个32位二进制数表示的是-2147483648,而不是0。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7472126
  • 你也可以参考下这篇文章:为什么在JavaScript中0.1+0.2不等于0.3?
  • 除此之外, 这篇博客: Javascript基础 86个面试题汇总 (附答案)中的 30. Javascript 中的“闭包”是什么?举个例子? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 闭包是在另一个函数(称为父函数)中定义的函数,并且可以访问在父函数作用域中声明和定义的变量。

    闭包可以访问三个作用域中的变量:

    • 在自己作用域中声明的变量;
    • 在父函数中声明的变量;
    • 在全局作用域中声明的变量。
    var globalVar = "abc";
    // 自调用函数
    (function outerFunction (outerArg) { // outerFunction 作用域开始
     // 在 outerFunction 函数作用域中声明的变量
     var outerFuncVar = 'x'; 
     // 闭包自调用函数
     (function innerFunction (innerArg) { // innerFunction 作用域开始
     // 在 innerFunction 函数作用域中声明的变量
     var innerFuncVar = "y";
     console.log( 
     "outerArg = " + outerArg + "
    " +
     "outerFuncVar = " + outerFuncVar + "
    " +
     "innerArg = " + innerArg + "
    " +
     "innerFuncVar = " + innerFuncVar + "
    " +
     "globalVar = " + globalVar);
     // innerFunction 作用域结束
     })(5); // 将 5 作为参数
    // outerFunction 作用域结束
    })(7); // 将 7 作为参数
    

    innerFunction 是在 outerFunction 中定义的闭包,可以访问在 outerFunction 作用域内声明和定义的所有变量。除此之外,闭包还可以访问在全局命名空间中声明的变量。

    上述代码的输出将是:

    outerArg = 7
    outerFuncVar = x
    innerArg = 5
    innerFuncVar = y
    globalVar = abc
    
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    在Javascript中,左移运算符 “<<”将32位二进制数向左移动指定位数,左边空出来的部分用0填补,右边超出32位的部分则截取掉,得到的结果仍是一个32位的二进制数。比如,1 << 31 实际上是将二进制数“1”向左移动31位,右边用0填补,得到的结果为“10000000000000000000000000000000”,是一个32位的二进制数。

    而为什么这个结果是负数 -2147483648,而不是正数0呢?这是因为在Javascript中,有符号整数使用二进制补码表示,并且范围是-2^31至2^31-1(32位),其中最高位表示符号位,0表示正数,1表示负数。而1 << 31 左移之后,最高位为1,表示负数。将这个32位的二进制数转换成十进制,需要把符号位去掉,然后求出真正的数值。由于这个数最高位为1,表示负数,因此要先将其取反(按位取反),然后再加1,得到的结果是“10000000000000000000000000000000”按位取反后是“01111111111111111111111111111111”,再加1后得到“10000000000000000000000000000000”,这就是-2147483648的二进制补码表示。

    因此,1 << 31 的结果是一个32位的二进制补码表示的负数,即-2147483648。

    代码示例:

    无实际代码示例。