2012-08-10 51 views
0

我有两个字节,我设置不同的位,以获得不同的组合。 例如,字节1的位7和字节2的位1,位2使组合设备就绪。 现在,我已经创建了面具如何将两位添加到十六进制

#define C1_device_ready (0x80 | 0x100 | 0x200) 

然后我读的数据,并尝试比较。 1字节我可以做(数据[0] &掩码==掩码)。 但是我怎样才能计算它有两个字节,数据[0] 和数据[1]的C1_device_ready掩码。 它很容易或我应该只在单个字节掩盖。 ::加入::数据是无符号字符数据[2]

回答

5

如果dataunsigned char阵列,则可以测试

if ((data[0] & mask) == (mask & 0xFF) && (data[1] & mask) == ((mask >> 8) & 0xFF)) 

或组合两个data[i]并检查

if (((data[0] | (data[1] << 8)) & mask) == mask) 
+0

感谢的作品。你能否解释一下这种转变(<< 8)。 – user1566277 2012-08-10 12:19:56

+0

'data [0] | (data [1] << 8)'将来自'data'数组的两个字节组合到一个'int'中,在最低有效字节中有'data [0]',每个班次的最低有效字节。由于位操作'''和'|'自动进行整数提升,所以不需要手动将一个转换插入到较大的类型。 – 2012-08-10 12:27:36

+0

这解释得很好。非常感谢这样一个明确的答案。 – user1566277 2012-08-10 12:40:31

2

使用

if (((data[0] | (data[1] << 8)) & mask) == mask) { 
    // do something 
} 
2
((data[0] | (data[1]<<8)) & mask) == mask 

应该工作。可能需要投事情unsigned int

0

尝试:

if ((*(short *)data) & C1_device_ready) 
+1

你应该添加==掩码 – Gir 2012-08-10 12:17:55

相关问题