设置位和使用十六进制值进行验证(C)

时间:2012-08-01 07:14:06

标签: c

在一个字节中,我设置了一些位 |视频|音频|扬声器| 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)会产生错误 并显示最先检查的内容。 我做错了什么?

4 个答案:

答案 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)

如果结果不为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");    
    }