我有一个简单的位掩码,3
(基数为2 "011"
)表示我应该提取array[0]
和array[1]
但不提取array[2]
有效的方法是什么?
最终,我正在生成一个新数组,其值超过.filter
这样的事情:
var bitmask = 37, // "100101"
array = ["a", "b", "c", "d", "e", "f"];
var array2 = array.filter((value, index) => {
// do something with bitmask and index to return true
});
// array2 should be ["a", "c", "f"];
答案 0 :(得分:7)
扩展原始示例,您可以执行此操作:
var bitmask = 37, // "100101"
array = ["a", "b", "c", "d", "e", "f"];
var array2 = array.filter((value, index) => {
// do something with bitmask and index to return true
return bitmask & (1 << index);
});
// array2 should be ["a", "c", "f"];
console.log(array2);
答案 1 :(得分:4)
var bitmask = 5, idx=0;
// Loop till bitmask reach 0, works when bitmask >= 0
// If you want to sure instead of implicit type converting (from number to boolean)
// Just change it to while(bitmask >= 0)
while(bitmask){
// If the rightmost bit is 1, take the array[index]
if(bitmask & 1) console.log("take arr["+idx+"]");
// Shift right by 1 bit, say 5 = 101, this will make the number become 2 = 10
bitmask>>=1;
// Increase the index
idx++;
}
&#13;
使用您自己的示例,代码可以运行:
var bitmask = 37, // "100101"
array = ["a", "b", "c", "d", "e", "f"],
idx = 0;
var array2 = [];
while(bitmask){
if(bitmask & 1) array2.push(array[idx]);
bitmask>>=1;
idx++;
}
&#13;
只需使用一些位操作来循环它。因为它一点一点地循环,我认为它是你能获得的最快的
答案 2 :(得分:0)
执行此操作的一种方法是将您的号码转换为二进制字符串,然后检查过滤器中位掩码的索引是否为"1"
。
var bitmask = (37).toString(2), // "100101"
array = ["a", "b", "c", "d", "e", "f"];
var array2 = array.filter((value, index) => {
if(bitmask[index] == "1") return value;
});
console.log(array2);
&#13;