我有一个问题,我有一个字节
的警报消息例如: 1)0000 0001 - 是警报1 2)0000 0010 - 是警报2 3)0000 1000 - 报警3 4)1000 0000 - 报警4
所以问题是,如果报警1和报警4同时出现如下字节:1000 0001,如果是报警1,2和4,则为:1000 0011 是否可以使用javascript函数获取警报的所有可能组合?
我知道只有4个,但这只是一个例子,我有一些所有8位
提前谢谢
答案 0 :(得分:1)
像这样的东西可以让所有的位都变得正常'位比较:
var val = 0b00000101;
function GetBits(val){
var i = 1, res = [];
while(i<=val){
if(i & val) res.push(i);
i <<=1;
}
return res;
}
console.log(GetBits(val));
但它看起来像是使用了备用位掩码?
如果警报是每个具有自定义掩码的对象,则在数组中,您可以使用filter
:
var alarms = [
{descr: 'Alarm 1', mask : 1},
{descr: 'Alarm 2', mask : 2},
{descr: 'Alarm 3', mask : 0b1000},
{descr: 'Alarm 4', mask : 0b10000000}
];
var val = 0b10000011;
var alarmsInVal = alarms.filter(function(a){ return val & a.mask;});
console.log(alarmsInVal);
获取上述过滤值字符串的示例:
var descr = alarmsInVal.map(function(a){return a.descr;}).join(', '); //Alarm 1, Alarm 2, Alarm 4
答案 1 :(得分:0)
您不需要找到所有组合来确定警报是否已开启。使用按位AND运算符。
var isAlarm1On = (alarm & 1) === 1;
var isAlarm2On = (alarm & 2) === 2;
var isAlarm3On = (alarm & 8) === 8;
var isAlarm4On = (alarm & 128) === 128;
对于最低有效位为1的任何字节都是如此。
以下情况属实: 0000 0001
<00> 0000 00111000 0001
1111 0001
1111 1111