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

Javascript 拉取与位掩码关联的数组值,javascript,algorithm,bitmask,Javascript,Algorithm,Bitmask,我有一个简单的位掩码,3(“011”,在基数2中),它表示我应该提取数组[0]和数组[1],而不是数组[2] 做这件事的有效方法是什么 最终,我将生成一个新数组,其中的值通过.filter 大概是这样的: var bitmask = 37, // "100101" array = ["a", "b", "c", "d", "e", "f"]; var array2 = array.filter((value, index) => { // do something wit

我有一个简单的位掩码,
3
“011”
,在基数2中),它表示我应该提取
数组[0]
数组[1]
,而不是
数组[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"];
var位掩码=5,idx=0;
//循环直到位掩码达到0,在位掩码>=0时工作
//如果要确定而不是隐式类型转换(从数字到布尔值)
//只需将其更改为while(位掩码>=0)
while(位掩码){
//如果最右边的位是1,则取数组[索引]
if(bitmask&1)console.log(“takearr[“+idx+”]);
//右移1位,比如说5=101,这将使数字变成2=10
位掩码>>=1;
//增加指数
idx++;

}
一种方法是将数字转换为二进制字符串,然后检查位掩码的索引是否在过滤器中为
“1”

var位掩码=(37).toString(2),/“100101”
数组=[“a”、“b”、“c”、“d”、“e”、“f”];
var array2=array.filter((值,索引)=>{
if(位掩码[索引]=“1”)返回值;
});

控制台日志(array2)扩展原始示例,您可以执行以下操作:

var位掩码=37,//“100101”
数组=[“a”、“b”、“c”、“d”、“e”、“f”];
var array2=array.filter((值,索引)=>{
//使用位掩码和索引执行某些操作以返回true

返回位掩码&(1)这不是位掩码,它是字符串。你是对的,但你知道我的意思,它实际上是一个数字,用二进制覆盖它,那么字符串将是有用的,这样你就可以遍历它并检查
“1”
。问题是,我正在从000001迭代到111111,这样我就可以得到所有可能的选择,以填充多达6个插槽,但我不确定是否要循环遍历字符串以及不应该返回的数组
['a','d','f']
?或者我把你的问题搞错了..如果位掩码长度大于数组长度怎么办?@neaumusic刚刚注意到你在问题中的注释,很抱歉我假设这是一个输入错误。在这种情况下,你只需反转字符串:
var bitmask=(37>>0)。toString(2)。split(“”)。reverse().join(“”)
。这都很好,这两个答案都是正确的,我只是想确定哪一个更有效,实际上我认为顺序并不重要,因为我也得到了所有的排列way@neaumusic可能是另一个答案,它是一个使用位运算符的基本while循环。我发现,如果
37>>索引
是奇数,那么它就是match,从1的数字开始exists@neaumusic在代码中添加一些注释,请看是否足够清晰。因为它只是将位掩码用作一个数字,不需要将其转换为字符串,不需要任何字符串操作,只需循环使用位掩码的所有二进制位,我认为这是最快的晕车方式,这非常完美,是的,我要做的<代码>(位掩码>>索引)%2
但这更干净