Javascript - 位警报消息 - 获取所有可能的组合

时间:2015-08-26 12:18:10

标签: javascript

我有一个问题,我有一个字节

的警报消息

例如: 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位

提前谢谢

2 个答案:

答案 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 0011

1000 0001

1111 0001

1111 1111