javascript二进制操作don'不适用于选项
javascript Binary operation don't work for options
这是我所拥有的。。。某些数组项具有二进制选项像
- $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)
将所有字符串(项和掩码)转换为数字。
如果mask
是0
,那么就拿走所有的项目。如果不是:
然后使用&
运算符查看常见的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 = 1001
是false
,即使1001 & 0001
是truthy0001
你可能不想在你的情况下使用完全匹配
你可以写一些代码,进行回调来处理你的数组
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;
- html5 drawImage适用于firefox,而不是chrome
- Jquery Ajax POST不工作.适用于GET
- 如何调试遗留的javascript代码(适用于IE,但在Google Chrome中不正常)
- .load()适用于window,而不是ID
- 使用Jquery更改css样式适用于id's、 不在课堂上
- 提交按钮不会;不适用于Chrome或Firefox,但适用于Internet Explorer
- 为什么 javascript 中的“btoa”编码适用于 20 位字符串而不是 20 位整数
- Javascript String to Date适用于Chrome,而不是FF或Safari
- Onchange,向上,向下箭头键适用于FF和Chrome,但在IE中不起作用
- .load() 适用于 IE 和 dreamweaver 预览版,但不能使用 opera 和 chrome
- 找不到适用于 Highcharts 的 JSON 数组语法
- 为什么在jQuery中使用focusout适用于Firefox,而使用addEventListener则不适用;t
- jQuery选择菜单验证器适用于FF和Chrome,但不适用IE
- 单选按钮'onclick'适用于Chrome和Firefox,但不适用IE
- JQuery ScrollTop适用于chrome,但不适用firefox
- window.opener.location.href适用于IE,但不适用Chrome或Safari
- Frame Busting buster不完全适用于IE
- Jquery touch punch适用于Chrome和Firefox,但不适用IE
- 背景更改仅适用于chrome+$.预加载不适用;不起作用
- JavaScript window.location.replace适用于Firefox,但不适用IE或Chrome