javascript二进制操作don'不适用于选项

javascript Binary operation don't work for options

本文关键字:不适用 适用于 选项 二进制 操作 don javascript      更新时间:2023-09-26

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

  • $item[0]=0010
  • $item[1]=1000
  • $item[2]=0110
  • $item[3]=1101

每个比特表示某种选择

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

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

只有当某些选项显示时,才必须有筛选器。。。

我应该在数学课上多听。。。我现在一无所知,请帮帮我!


注意:一切都来自这里:http://jsfiddle.net/yHxue/但我不明白这句话: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(function(n, i) {
    if (customerOption === 0 || ((parseInt(n, 2) & customerOption) == customerOption))
        document.querySelector("pre").textContent += "'n0010 matched index: " + i;
});
document.querySelector("pre").textContent += "'n'n"
var customerOption = parseInt("0110", 2)
$item.forEach(function(n, i) {
    if (customerOption === 0 || ((parseInt(n, 2) & customerOption) == customerOption))
        document.querySelector("pre").textContent += "'n0110 matched index: " + i;
});
<pre></pre>

使用parseInt(string, 2)将所有字符串(项和掩码)转换为数字。

如果mask0,那么就拿走所有的项目。如果不是:

然后使用&运算符查看常见的1位:

var common = item & mask;

然后测试common:

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

编辑:

markers[m].setMap(
  ((markers[m].props & props) >>> 0 === props) ?
  ((props) ? map : null) :
  null
);

markers[m].props & props查找公共1比特,正如我上面所解释的;>>> 0确保数字为正。将结果与props进行测试,确保公共位是props中的所有位(如我在上面的第二个选项中所述)。如果所有的props位都被设置,并且如果props不为零,则markers[m]setMap-ped到map;否则返回到null

var selections = ['0010', '1000', '0110', '1111'];
var getRequiredSelections = function (customerSelection) {
    var customerSelectionInt = parseInt(customerSelection, 2);
    if (customerSelectionInt) {
        return selections.filter(function (binaryString) {
            return parseInt(binaryString, 2) & customerSelectionInt;
        });
    } else {
        return selections;
    }
};

你可以这样使用:

getRequiredSelections('0010');

但是,当没有客户选项检查时:0000我必须向他们显示所有

在2的称赞中,-1是二进制中的所有1

if (!props) props = -1;

测试二进制文件,同时使用&===

needle === (needle & haystack)

这意味着在haystack = 0001中查找needle = 1001false,即使1001 & 0001truthy0001

你可能不想在你的情况下使用完全匹配


你可以写一些代码,进行回调来处理你的数组

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);
    });
}

当然,您可能希望调整测试以针对e.props

您所拥有的代码几乎已经存在;只需在props为零时添加一个额外的检查:

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

演示

markers[m].props & props表达式将是0(如果不是props的所有比特都匹配)或props本身的值(如果props的所有比特匹配)。

额外的>>>0会将表达式转换为无符号的32位整数值,但如果使用以下表达式,则没有必要:

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