我创建了一个从远程JSON读取值的项目。在这个项目中,远程JSON可以给我一个变量16种不同类型的警报。实现是以int表示的bybitary 16bit值。因此,如果有第三个警报,它应该返回8(bynary 1000),如果第二个,第八个和第十个警报结束,则返回1284(二进制10100000100)。那么当没有警报时,它会返回0。 所以,我在JS中创建了一个函数(根据here)传递返回的值(示例中为8/1284/0),如果有警报,则返回一个简单的true或false。功能很简单:
function IsOnAlarm(passedVal) {
if (passedVal & 0) {
return false;
} else {
return true;
}
}
但它不起作用:-( 我创建了一个显示问题的JSFiddle。我该如何解决?提前谢谢。
答案 0 :(得分:2)
据我所知,你只需要检查值是否为0.不需要任何按位操作。
function IsOnAlarm(passedVal) {
return passedVal != 0;
}
旁注:passedVal & 0
始终为0
,无论passedVal
是什么(这就是为什么它始终转到else
)。
答案 1 :(得分:1)
你可以这样做
function IsOnAlarm(passedVal) {
if (passedVal != 0) {
return false;
} else {
return true;
}
}
答案 2 :(得分:0)
如果其中一个操作数为零,则AND运算符始终返回false,请参见下文:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
重写函数的最简单方法如下:
function IsOnAlarm(passedVal) {
return !!passedVal;
}
说明:双重否定操作(!!
)允许您将输入强制转换为布尔值。任何非零值都将计算为true,零计算结果为false。
答案 3 :(得分:0)
检查此jsfiddle,它使用按位AND比较。
我修改了您的功能以便于理解:
function AreAlarmsOn(alarmsToCheck, alarmState) {
return and(alarmsToCheck, alarmState)!=0;
}
它需要alarmToCheck并根据alarmState位检查其位,如果需要检查多个警报,alarmToCheck可以为多个警报提供位。
答案 4 :(得分: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