拉取与位掩码关联的数组值

时间:2016-06-30 02:10:28

标签: javascript algorithm bitmask

我有一个简单的位掩码,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"];

3 个答案:

答案 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)

&#13;
&#13;
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;
&#13;
&#13;

使用您自己的示例,代码可以运行:

&#13;
&#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;
&#13;
&#13;

只需使用一些位操作来循环它。因为它一点一点地循环,我认为它是你能获得的最快的

答案 2 :(得分:0)

执行此操作的一种方法是将您的号码转换为二进制字符串,然后检查过滤器中位掩码的索引是否为"1"

&#13;
&#13;
    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;
&#13;
&#13;