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

时间:2015-03-19 02:09:16

标签: javascript arrays binary

这是我的...... 某个数组项具有二进制选项 喜欢

  • $ 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);,所以我重写了它,我的不工作!

5 个答案:

答案 0 :(得分:1)

如果您的数据是实际数字,那么只需在每个成员上使用按位&运算符。

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>

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

但是,如果没有客户选项,请检查:0000我必须全部显示

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

if (!props) props = -1;

准确测试二进制内容,同时使用&===

needle === (needle & haystack)

这意味着needle = 1001 haystack = 0001中的false1001 & 0001,即使0001 truthy 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

当然,您可能希望调整测试以对抗{{1}}

答案 4 :(得分:0)

你的代码几乎就在那里;只需添加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);
}

Demo

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

附加>>>0会将表达式转换为无符号的32位整数值,但如果使用以下表达式则不需要它:

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