[英]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.