javascript二进制操作don';我不为选择而工作

javascript二进制操作don';我不为选择而工作,javascript,arrays,binary,Javascript,Arrays,Binary,这是我所拥有的。。。 某些数组项具有二进制选项 像 $item[0]=0010 $item[1]=1000 $item[2]=0110 $item[3]=1101 每个位代表一些选项 我需要的是将其与客户请求选项进行比较 假设是0010 所以我需要逻辑只显示$item[0]和$item[2],因为第二个字节是1。但是,当没有客户选项时,检查:0000我必须全部显示 仅当显示某些选项时,必须有筛选器 我应该在数学课上多听。。。我现在不知所措,请帮帮我 注: 一切都来自这里: 但我不明白这句话

这是我所拥有的。。。 某些数组项具有二进制选项 像

  • $item[0]=0010
  • $item[1]=1000
  • $item[2]=0110
  • $item[3]=1101
每个位代表一些选项

我需要的是将其与客户请求选项进行比较 假设是0010

所以我需要逻辑只显示$item[0]和$item[2],因为第二个字节是1。但是,当没有客户选项时,检查:0000我必须全部显示

仅当显示某些选项时,必须有筛选器

我应该在数学课上多听。。。我现在不知所措,请帮帮我


注: 一切都来自这里: 但我不明白这句话:
markers[m].setMap(((markers[m].props&props)>>>0==props)?((props)?map:null):null),所以我重写了它,我的不工作

如果您的数据是实际数字,则只需对每个成员使用按位
运算符即可

var customerOption = parseInt("0010", 2)

$item.forEach(function(n, i) {
    if (customerOption === 0 || ((n & customerOption) == customerOption))
        alert(i); // show this item
});
如果它们是字符串,那么您需要首先将每个项目转换为数字

同上,但是

parseInt(n, 2);
var$item=[];
$item[0]=“0010”
$item[1]=“1000”
$item[2]=“0110”
$item[3]=“1101”
var customerOption=parseInt(“0010”,2)
$item.forEach(函数(n,i){
if(customerOption==0 | |((parseInt(n,2)&customerOption==customerOption))
document.querySelector(“pre”).textContent+=“\n0010匹配索引:”+i;
});
document.querySelector(“pre”).textContent+=“\n\n”
var customerOption=parseInt(“0110”,2)
$item.forEach(函数(n,i){
if(customerOption==0 | |((parseInt(n,2)&customerOption==customerOption))
document.querySelector(“pre”).textContent+=“\n0110匹配索引:”+i;
});
使用
parseInt(string,2)
将所有字符串(项目以及掩码)转换为一个数字

如果
mask
0
,只需获取所有项目即可。如果没有:

然后使用
&
运算符查看公共
1
位:

markers[m].setMap(
  ((markers[m].props & props) >>> 0 === props) ?
  ((props) ? map : null) :
  null
);
然后测试
通用

  • 如果您想要任何掩码位,那么
    common
    不应该是
    0
  • 如果需要所有掩码位,则
    common
    应等于
    mask
编辑:

markers[m].props&props
查找公共
1
位,如上所述<代码>>>0
确保数字为正数。根据
props
测试结果,确保公共位是
props
中的所有位(如上面我的第二个选项)。如果设置了所有
props
位,并且
props
不为零,则
标记[m]
setMap
-ped至
map
;否则,请转到
null

getRequiredSelections('0010');
您可以这样使用它:

if (!props) props = -1;
但是,当没有客户选项时,检查:0000我必须全部显示

在2的恭维语中,-1是二进制的所有
1

needle === (needle & haystack)

测试二进制格式的内容时,请同时使用
&
=

function applyByFlag(flag, callbackTrue, callbackFalse) {
    if (!flag)
        flag = -1;
    function nop() {}
    if (!callbackTrue) callbackTrue = nop;
    if (!callbackFalse) callbackFalse = nop;
    boxes.forEach(function (e, i, a) {
        if (flag & e) // not exact test
            callbackTrue.call(e, e, i, a);
        else
            callbackFalse.call(e, e, i, a);
    });
}
这意味着在
haystack=0001
中查找
needle=1001
false
,即使
1001&0001
是真实的
0001

您可能不希望在您的案例中使用完全匹配


您可以编写一些代码,使用回调来处理数组

for(var m=0; m < markers.length; m++) {
    var show = (markers[m].props & props)>>>0===props || props == 0;
    markers[m].setMap(show ? map : null);
}

当然,您可能希望调整测试,使其与
e.props

相对应,您的代码几乎就在那里;只需在
props
为零时添加额外的检查:

var show = (markers[m].props & props) || props == 0;

数组项是字符串还是数字?
0010
不是二进制,而是十进制数
10
。JavaScript des不支持二进制文本。你是说字符串
“0010”
?一个字符串,因为我需要从右到左构建它,但如果需要,我可以将它转换为数字,它是EZ!如果客户选项为
0010
,为什么要排除项目
0
?你的意思是
0100
?不是,检查我的编辑这行的解释很有用。。。你应该选择这个作为正确答案。。。。但这并不完美。。。谢谢!我不熟悉接线员。。。但是现在代码是。。。如果一位开启或另一位开启,则。。。我需要的是,穿上一点,而不是。。。未来的变化是什么code@menardmam:不知道你的意思。您是说
客户选项将有两个位要测试吗?你能举个例子吗?所以如果客户要求0110,那么只有[3]会有……更深入的解释。。。如果a=1010101011和b=00000000 11,客户要求00000000 11,则最后两位都打开,a+b显示!清楚吗?@menardmam:Change
!=0
==客户选项
&
运算符将返回匹配的任何位,因此如果将其与原始值进行比较,则只有当它们都匹配时,才为
true
。演示:
for(var m=0; m < markers.length; m++) {
    var show = (markers[m].props & props)>>>0===props || props == 0;
    markers[m].setMap(show ? map : null);
}
var show = (markers[m].props & props) || props == 0;