2013-08-16 63 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