根据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}
答案 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_ );