什么是Javascript中的32位整数?

Igg*_*ggy 20 javascript integer

我正在做一些编码挑战,遇到了一些我不太熟悉的东西.我更好奇地了解它是什么以及它为什么存在.

提示非常简单: Given a 32-bit signed integer, reverse digits of an integer.

Example:
Input: -123
Output: -321

Example:    
Input: 120
Output: 21

Assume we are dealing with an environment which could only hold integers within the 32-bit signed integer range. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
Run Code Online (Sandbox Code Playgroud)

我想出了这个.

var reverse = function(x) {
    var isNegative = false;
    if(x < 0){
        isNegative = true;
        x *= -1;
    };
    var reverseX = parseInt(String(x).split('').reverse((a,b) => a - b).join(''));
    if(reverseX > Math.pow(2,32)){
      return 0;
    }
    if(isNegative){
        return -1 * reverseX
    } else {
        return reverseX;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,我对一些失败的测试感到难过:

Input:
1563847412
Output:
2147483651
Expected: 0
Run Code Online (Sandbox Code Playgroud)

根据我的理解,32位整数是2 ^ 32.它在JS中的意义是什么?如果我开始过去会发生什么?(2^32 + 1)

我的第二个问题,如果我可能会问两个,我是"预期",如果价值reverseX超过2 ^ 32,但它仍然没有通过测试.

   if(reverseX > Math.pow(2,32)){
      return 0;
    }
Run Code Online (Sandbox Code Playgroud)

0当我超过32位整数时,如何正确返回?

tri*_*cot 24

符号整数的上限不是2 32 - 1,而是2 31 - 1,因为第一位是符号位.

如果进行比较,您将看到您的测试给出了正确的结果.

请注意,JavaScript 对数字使用IEEE-754浮点表示,即使它们是整数.但是浮点精度足以在32位整数上执行精确计算.如您所知,您需要进行必要的测试以检测32位溢出.

关于你的代码的一些注释:它将一个参数传递给Array#reverse方法,这是一个不带参数的方法.我将如何编写它 - 请参阅代码中的注释:

// Name argument n instead of x, as that latter is commonly used for decimal numbers 
function reverse(n) {
    // Array#reverse method takes no argument.
    // You can use `Math.abs()` instead of changing the sign if negative.
    // Conversion of string to number can be done with unary plus operator.
    var reverseN = +String(Math.abs(n)).split('').reverse().join('');
    // Use a number constant instead of calculating the power
    if (reverseN > 0x7FFFFFFF) {
        return 0;
    }
    // As we did not change the sign, you can do without the boolean isNegative.
    // Don't multiply with -1, just use the unary minus operator.
    // The ternary operator might interest you as well (you could even use it
    //    to combine the above return into one return statement)
    return n < 0 ? -reverseN : reverseN;
}

console.log(reverse(-123));
console.log(reverse(1563847412));
Run Code Online (Sandbox Code Playgroud)

  • OP从未提到leetcode,也没有提到这个要求。无论如何,所有要求都应该在问题中。OP 不能假设我们知道他们正在处理 leetcode 挑战,并且我们应该阅读场外内容以完全理解该问题。我们应该只考虑问题中存在的规范以及OP的特定问题。 (3认同)
  • 为您的答案脱帽致敬:运行时间:84 毫秒,比反向整数的 JavaScript 在线提交的 83.91% 快。内存使用:35.9 MB,不到反向整数的 JavaScript 在线提交的 56.21%。 (2认同)
  • 谢谢!你是怎么发现‘2^31 -1’是‘0x7FFFFFFF’的? (2认同)
  • @ vbarinov,2 ^ 31的二进制表示形式是1后面是31个零(就像十进制的10 ^ 6是1后面是6个零)。每组4个二进制数字(从右开始)是一个十六进制数字,因此2 ^ 31是0x80000000。然后减一... (2认同)

小智 7

var reverse = function(x) {
  let ans = parseInt(x.toString().split('').reverse().join('').toString());

  if (x < 0) { ans *= -1; }

  if (ans < (Math.pow(2, 31) * -1) || ans > Math.pow(2, 31) - 1) return 0;
  return ans;
};

console.log("Reverse of 123: " + reverse(123));
console.log("Reverse of -123: " + reverse(-123));
Run Code Online (Sandbox Code Playgroud)

  • 在与 OP 问题相关的地方添加关于正在发生的事情的两行描述,将为以后访问此答案的每个人提供更广泛的背景信息。 (5认同)

Rob*_*zak 5

但是,我对一些失败的测试感到困惑:

Input:
1563847412
Output:
2147483651
Expected: 0
Run Code Online (Sandbox Code Playgroud)

最大32位整数,我相信是(2^31)为2,147,483,647。这样可以存储负值以及(-2^31)32位限制(这是“有符号”的含义)。因此,任何数量高于,你可以为你的程序的缘故返回0。如果提示要求你为“未签名”,范围将是02^32你最初设想。

就失败的测试而言,21474836512,147,483,647要大4,因此您应该返回0。相反,您应该说reverseX > Math.pow(2,31) - 1

在JS中它的意义是什么?如果我开始学习该怎么办?(2 ^ 32 +1)

Technicially在JS你不受此数的限制,JS使用有效位数 双精度浮点数字。所以最大值实际上是(2^53) - 1