2013-08-16 34 views
4

位移位是否JavaScript代码整数除法和在JavaScript

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

总是表示“由2个整数等分无滞留者”?我关心的是如果整数字面大于一个字节的话,

我的问题的背景是这样的:

我有范围的整数变量从0到2^32-1,将适合入UINT32如果我有一个类型的编程语言比JS不同。我需要将它转换成一个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进行分隔来填充数组。但是真正的divions“/”会将该变量转换为浮点变量。所以我使用“>> 8”,但这实际上是假设大的排序。

+0

“此代码的工作在我的浏览器,但我不知道这是否会做无处不在”你的意思是用其他语言?或者你是否要求确认'x >> y'将'x'转换为(带符号)_Int32_。它也保留最左边的位(它们不会成为'0',这是如果你使用'>>>'会发生什么)。 –

+0

随着“无处不在”我想说“在每台机器上的每个浏览器”。我的电脑都是英特尔兼容的,所以我无法确认在大型排序的设备上会发生什么情况。 – user2690527

回答

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 
+0

嗨。对不起,'n >> 8'是一个错字。这很明显。 您的回复的第二部分回答了我的问题 'var a = uInt32ToLEByteArray(0xFF) console.log(a); //总是[255,0,0,0]' 是我希望听到的,尽管我不明白你为什么说endianess是无关紧要的。 – user2690527

+0

@ user2690527因为它是 - 它永远是相同的结果,因为无论endianess因此endianess不相关 – Esailija

+0

我认为以下可能是正确的:假设我们有一个十进制值992的整数,这是0x03E0作为一个十六进制文字。在一个大型机器上,它被存储为字节序列“0x03,0xE0”。现在我们右移四位(>> 4)。结果是“0x00,0x3E”。返回十进制表示形式,这等于62.总之,“>> 4”相当于2^4 = 16的分解。现在我们来看看小端机器的错误假设。 992等于0x03E0并存储为“0xE0,0x03”。由4位移位产生“0x0E,0x00”,它是0x000E作为数字文字或14作为十进制数字。 – user2690527