如何在javascript中使用uint8array?

时间:2013-08-31 10:31:57

标签: javascript

根据this回答的评论,我想使用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} 

my notes are here.

3 个答案:

答案 0 :(得分:0)

您是否想要 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);

答案 1 :(得分:0)

这有用吗?

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可能比此更快。

答案 2 :(得分:0)

如果你想要更快的速度,那就把所有的id都作为整数处理,而不是数组,并且用&amp;和|运营:

 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&lt;&lt; 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) ;

这里我们将对内存的访问权交换为相同数量的布尔操作 如果在循环中使用此测试来过滤阵列,则速度增益很大。

以同样的方式设置/清除/交换单个指令中的几个位,测试一个条件集是否包含在另一个中,测试它们是否正交,....所有这些都是非常快速的。

唯一限制是使用此方法可以处理不超过32种可能性。

然后,您可以将ID存储在键入的类型数组中,具体取决于最大数量 可能性,只使用Int8Array或Int32Array,但我不确定收益 与[]相比,在表现方面会很有趣。

语法:

var arr = new Int8Array( _length_ );

var arr = new Int32Array( _length_ );