簡體   English   中英

如何在JavaScript中使用unit8array?

[英]How to use unit8array in javascript?

根據答案的評論,我想使用Unit8Array來實現相同的目的:

var bin = parseInt('1000', 2); //=8

我的意思是:

輸入是:

length = 4
digits = [1,0,0,0]

在使用TypedArray魔術之后,輸出將是:

8

讓我們看一個具體的示例(長度為2位):

counts = {};
var a = [[0,1],[0,0],[0,1],[0,0],[0,0],[1,1]]; 
for(var i in a){
  var id = parseInt(a[i].join(''), 2);
  if(!++counts[id])counts[id] = 1;
}
console.log(counts); //{0: 3, 1: 2, 3: 1} 

我的筆記在這里。

您是否要獲取此parseInt(string, radix)

radix一個整數,表示上述字符串的基數。

不確定,有點像您期望的那樣

var x = new Uint8Array([1,0,0,0]);
var a = x[0].toString()+x[1].toString()+x[2].toString()+x[3].toString();
console.log(parseInt(a, 2));
console.log(a.length);

這有用嗎?

var a = 1 << 3; // shift the bits of 1 (0001) 3 places: 1000
if (a == 8) {
    // this block will execute
}

另一個例子:

var i,
    result = 0,
    len = 4,
    bits = [1, 0, 0, 0];

for (i = 0; i < len; ++i) {
    result = (result << 1) + bits[i];
}

alert(result);

請記住, parseInt可能比這快。

如果要提高速度,請將所有現成的id作為整數而不是數組處理,並用&和|進行位更改。 操作:

 counts = {};
 var a = [1,0,1,0,0,3]; 
 for(var i=0; i<a.length; i++ ){
    var c = counts[a[i]] || 0 ;
    counts[a[i]]= c+1 ;
 }
 console.log(counts); // { 0: 3,  1: 2, 3: 1 }

設置第k位:

id |=  1 << k;

清除第k位:

id &= !(1 << k);

交換第k位:

id ^= (1 << k);

讀取第k位:

bitK = (id >> k ) & 1;

因此,您可能會編寫一些小的函數來執行這些操作,而它們有99%的機會會被javascript引擎內聯,這將比數組處理+ parseInt快得多。
您甚至可以直接編寫此代碼。 也許在某些情況下,您將能夠緩存1 << k,但是無論如何,移位指令的開銷很小。

另一個優點是您可以在一條指令中處理多個測試,例如:

var setRequiredMask   = ( 1<<3 |  1<<5 ) ;   // to test if bits 3 and 5 set
var clearRequiredMask = ( 1<<2 | 1 <<4 ) ;   // to test if bit 2 and 4 cleared
var someRequiredMask  = ( 1<<0 | 1 <<6 ) ;   // to test if either bit 0 or bit 6 to be set

var satisfyConditions = ((id & setRequiredMask) == setRequiredMask) && 
                         ((id & !clearRequiredMask) ==0 ) &&
                            (id & someRequiredMask) ;

在這里,我們將對內存的7訪問權換成相同數量的布爾操作。
如果將此測試用在循環中以過濾陣列,則速度增益將很大。

以相同的方式,您可以在一條指令中設置/清除/交換數個位,以一種非常快速的方式測試一個條件集是否包含在另一個條件集中,測試它們是否正交....

唯一的限制是,使用此方法最多只能處理32種可能性。

然后,您可以將ID存儲在一個類型化的類型化數組中,具體取決於最大可能性,僅使用Int8Array或Int32Array,但是我不確定與[]相比,性能的提高是否會那么有趣。

句法 :

var arr = new Int8Array( _length_ );

要么

var arr = new Int32Array( _length_ );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM