【问题标题】:Integer division and bit shift in JavaScriptJavaScript 中的整数除法和位移
【发布时间】:2013-08-16 20:01:06
【问题描述】:

是否有 JavaScript 代码

var n = 8; // or some arbitrary integer literal
n >> 1;

总是表示“整数除以 2 没有余数”?如果整数文字大于一个字节,我担心的是字节顺序。

我的问题背景如下:

如果我有一种不同于 JS 的类型化编程语言,我有一个 0 到 2^32-1 范围内的整数变量,它将适合 uint32。我需要将其转换为具有四个元素的 Uint4Array,以小端顺序排列。

我目前的 JavaScript 方法是:

function uInt32ToLEByteArray( n ) {
  var byteArray = new Uint8Array(4);
    for( var i = 0; i < 4; i++ ) {
      byteArray[i] = n & 255;
      n >> 8;
    }
  return byteArray;
}

这段代码在我的浏览器中有效,但我想知道这是否适用于任何地方。主要思想是通过取 LSB 并除以 256 来填充数组。但真正的除法“/”会将变量转换为浮点变量。所以我使用“>>8”,但这实际上假设了大字节序。

【问题讨论】:

  • "这段代码在我的浏览器中有效,但我想知道这是否适用于任何地方。"你是说其他语言?或者您是否要求确认x &gt;&gt; yx 转换为(签名的)Int32。它还保留最左边的位(它们不会变成0,如果你使用&gt;&gt;&gt;,会发生这种情况)。
  • 对于“无处不在”,我想说“在每台机器上的每个浏览器中”。我的计算机都与 Intel 兼容,因此我无法确定在具有大字节序的设备上会发生什么。

标签: javascript endianness bit-shift integer-division


【解决方案1】:

您提供的代码与字节序完全无关。

但是,如果您要重新解释 uint32 数组中的字节数组,那么结果会根据运行浏览器的机器的字节序而有所不同。

首先,修复代码中的bug:

function uInt32ToLEByteArray(n) {
    var byteArray = new Uint8Array(4);
    for (var i = 0; i < 4; i++) {
        byteArray[i] = n & 255;
        n >>>= 8; //simply doing n >> 8 has no effect actually
    }
    return byteArray;
}

然后

var a = uInt32ToLEByteArray(0xFF)
console.log(a);
//always [255, 0, 0, 0]

var b = new Uint32Array(a.buffer);
console.log(b);
//[255] on little endian machines
//[4278190080] on big endian machines

【讨论】:

  • 嗨。抱歉,n &gt;&gt; 8 打错了。这是显而易见的。您回复的第二部分回答了我的问题` var a = uInt32ToLEByteArray(0xFF) console.log(a); //always [255, 0, 0, 0]` 是我希望听到的,虽然我不明白你为什么说字节序无关。
  • @user2690527 因为它是 - 无论字节序如何,它总是相同的结果,因此字节序不相关
  • 我认为以下可能是正确的:假设我们有一个十进制值为 992 的整数,这是 0x03E0 作为十六进制文字。在大端机器上,这被存储为字节序列“0x03,0xE0”。现在我们右移四位 (>>4)。结果是“0x00,0x3E”。回到十进制表示,这等于 62。总而言之,“>>4”等价于 2^4=16 的除法。现在我们来看看我对小端机器的错误假设。 992 等于 0x03E0 并存储为“0xE0,0x03”。移位 4 位产生“0x0E,0x00”,即 0x000E 作为数字文字或 14 作为十进制数。
  • @user2690527 移位不在内存中执行,而是首先从内存加载到 CPU 寄存器中(其中字节序无关,因为您无法以字节为单位寻址寄存器)。因此它将具有相同的逻辑结果 (62)。然后将数字 62 本身以字节序依赖的格式存储在内存中。
  • @user2690527 我为您找到了一些文章,以便您了解字节序何时很重要en.wikipedia.org/wiki/Endianesscs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多