在一个字节中,我设置了一些位
|视频|音频|扬声器| mic |耳机|带位
| 1 | 1 | 1 | 3 | 1 | 1
除了具有3个字节的麦克风之外,所有的1个字节,因此可以有7个组合离开
第一个组合。
#define Video 0x01
#define Audio 0x02
#define Speaker 0x04
#define MicType1 0x08
#define MicType2 0x10
#define MicType3 0x20
#define MicType4 (0x08 | 0x10)
#define MicType5 (0x08 | 0x20)
#define MicType6 (0x10 | 0x20)
#define MicType7 ((0x08 | 0x10) | 0x20)
#define HeadPhone 0x40
#define Led 0x80
现在我设置位
MySpecs[2] |= (1 << 0);
MySpecs[2] |= (1 << 2);
//设置mictype6
MySpecs[2] |= (1 << 4);
MySpecs[2] |= (1 << 5);
当我这样读的时候
readCamSpecs()
{
if(data[0] & Video)
printf("device with Video\n");
else
printf("device with no Video\n");
if(data[0] & Audio)
printf("device with Audio\n");
else
printf("device with no Audio\n");
if(data[0] & Mictype7)
printf("device with Mictype7\n");
if(data[0] & Mictype6)
printf("device with Mictype6\n");
}
用单个位设置的值,它可以找到。 但是用多个位设置的值(例如,MicType5,6,7)会产生错误 并显示最先检查的内容。 我做错了什么?
答案 0 :(得分:2)
即使只设置了一个位,您的&
检查也会成功,因为结果仍然不为零。
请尝试if ( data[0] & Mictype7 == MicType7 )
。
答案 1 :(得分:2)
试试这个:
#define MicTypeMask (0x08 | 0x10 | 0x20)
if((data[0] & MicTypeMask) == Mictype7)
printf("device with Mictype7\n");
if((data[0] & MicTypeMask) == Mictype6)
printf("device with Mictype6\n");
if((data[0] & MicTypeMask) == 0)
printf("device without Mic\n");
答案 2 :(得分:0)
data[0] & Mictype7
将评估为真,即如果设置了3位中的任何一位。以下内容将精确匹配MicType7:
if(data[0] & Mictype7 == Mictype7)
试试看这个概念:
if (Mictype7 & Mictype6) printf("Oh what is it?!!");
答案 3 :(得分:0)
我建议你删除其他部分。因为不必要地它会打印错误消息。
readCamSpecs()
{
if(!data[0])
printf("Print your error message stating nothing is connected. \n");
if(data[0] & Video)
printf("device with Video\n");
if(data[0] & Audio)
printf("device with Audio\n");
if(data[0] & Mictype7)
printf("device with Mictype7\n");
if(data[0] & Mictype6)
printf("device with Mictype6\n");
}