1

我制作了一个从远程 JSON 读取值的项目。在这个项目中,远程 JSON 可以给我一个变量 16 种不同类型的警报。该实现是通过以 int 表示的二元 16 位值。因此,如果有第三个警报,它应该返回我 8(二进制 1000),如果第二个、第八个和第十个警报出现,它返回我 1284(二进制 10100000100)。好吧,当没有警报时,它会返回 0。因此,我在 JS 中创建了一个函数(根据此处),如果有警报。该功能非常简单:

function IsOnAlarm(passedVal) {
    if (passedVal & 0) {
        return false;
    } else {
        return true;
    }
}

但它不起作用:-(我创建了一个显示问题的JSFiddle。我该如何解决?提前致谢。

4

5 回答 5

2

好吧,据我了解,您只需要检查该值是否为 0。不需要任何按位运算。

function IsOnAlarm(passedVal) {
    return passedVal != 0;
}

旁注:passedVal & 0总是0不管是什么passedVal(这就是为什么它总是去else)。

于 2014-03-13T08:05:48.980 回答
1

你可以这样做

function IsOnAlarm(passedVal) {
    if (passedVal != 0) {
        return false;
    } else {
        return true;
    }
}

检查这个http://jsfiddle.net/KQH43/3/

于 2014-03-13T08:13:07.843 回答
0

这是你要找的吗?

var getFlags = function(val) {
    var results = [];
    for (var i = 0; i < 16; i++) {
        results.push(!!((val >> i) & 1));
    }
    return results;
};

var flags = getFlags(1284);

flags[2] //=> true
flags[8] //=> true
flags[10] //=> true
// all other values ==> false / undefined
于 2014-03-13T10:37:12.307 回答
0

如果操作数之一为零,AND 运算符总是返回 false,见下文:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

重写函数的最简单方法如下:

function IsOnAlarm(passedVal) {
    return !!passedVal;
}

说明:双重否定运算 ( !!) 允许您将输入转换为布尔值。任何非零值将评估为真,零评估为假。

于 2014-03-13T08:19:19.273 回答
0

检查这个jsfiddle,它使用按位与比较。

我已经修改了您的功能以使其更易于理解:

function AreAlarmsOn(alarmsToCheck, alarmState) {
    return and(alarmsToCheck, alarmState)!=0;
}

它需要alarmsToCheck 并根据alarmState 位检查其位,如果您需要检查多个警报,alarmsToCheck 可以具有多个警报的位。

于 2014-03-13T08:50:13.153 回答