Javascript 判断16进制某位数据是否为1

因为物联网设备上来的都是16进制的数据,但某些数据是需要判断某一个16位数据的二进制位,因此需要判断某一位是否为1。

例如:

16进制  0x11  展开后二进制是 00010001

如果用toString(2) 转换为字符串,就成  10001,这样判断也不是很方便。因此还是位移方便。而且转换字符串后对系统的负担也会对应的增大。

采用& 与运算 ,然后位移对应的位数即可。

这里贴出一段代码,就不再详细说了,看代码比较明了

 

    //485数据 原始数据类型:FA 02 00 00 00 D0 F5
    //FA:帧头
    //02:数据长度
    //00:状态正常 04:报警
    //00 BIT7-6 00:正常/01故障; BIT5-4 00:正常/01:低压; BIT3 0:正常/1被拆(暂无、预留) BIT2-0 000正常/001测试/010消音
    01020304
    //00:CRC16 高字节
    //D0: CRC16 低字节
    //F5: 数据帧尾
    if (bytes[0] == 0xFA) {
        if (bytes[2] == 0x04) {
            data.Alarm = true;
        } else {
            data.Alarm = false;
        }
        let tmp = bytes[3]
        if (((tmp & 0x01)) == 1) {
            data.keyStatus = "测试"
        } else if (((tmp & 0x02) >> 1) == 1) {
            data.keyStatus = "消音"
        } else {
            data.keyStatus = "正常"
        }
        if (((tmp & 0x10) >> 4) == 1) {
            data.LowPower = true;
        } else {
            data.LowPower = false;
        }
        //
        if (((tmp & 0x40) >> 6) == 1) {
            data.Status = false
        } else {
            data.Status = true
        }
    }


//如果感觉if太长,可以简化,但是多层if的不清楚怎么简化,知道的朋友可以给发下。

if (bytes[0] == 0xFA) {
        data.Alarm = (bytes[2] == 0x04) ? true : false;
        let tmp = bytes[3]
        if (((tmp & 0x01)) == 1) {
            data.keyStatus = "测试"
        } else if (((tmp & 0x02) >> 1) == 1) {
            data.keyStatus = "消音"
        } else {
            data.keyStatus = "正常"
        }
        data.LowPower = (((tmp & 0x10) >> 4) == 1) ? true : false;
        data.Status = (((tmp & 0x40) >> 6) == 1) ? false : true;
    }

发表回复

登录... 后才能评论