2012-08-01 86 views
3

在一個字節中,我設置了一些位 | Video |音頻|揚聲器| mic |耳機|以位 | 1 |爲首1 | 1 | 3 | 1 | 1
1個字節,除了有3個字節的話筒,因此可以有7個組合離開 第一個組合。使用十六進制值設置位和驗證(C)

#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)會導致錯誤 ,並顯示檢查中的第一項。 我在做什麼錯?

+1

給予好評的作者 - 他是太低,無法給予好評 – 2012-08-01 07:22:20

回答

2

&檢查成功,即使只有一個位集,其結果仍然是非零。

改爲嘗試if (data[0] & Mictype7 == MicType7)

+0

像魅力一樣工作。只有一個必須加上額外的括號,否則 將從左到右進行比較。如果((data [0]&Mictype7)== MicType7),這適用於我的編譯器 。 P.S.什麼是論壇。謝謝大家。抱歉不能讚賞你,沒有足夠的幾內亞。 – user1566277 2012-08-01 07:47:05

0

data[0] & Mictype7如果結果不爲0,則判定爲真,即,如果設置了3位中的任何一個。下面將精確地匹配MicType7: if(data[0] & Mictype7 == Mictype7)

嘗試了這一點,看看這個概念: if (Mictype7 & Mictype6) printf("Oh what is it?!!");

+0

謝謝你的答案有用的答案。 – user1566277 2012-08-01 09:54:47

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");  
    } 
+1

很好的建議。謝謝 – user1566277 2012-08-01 09:53:57

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"); 
+0

許多感謝您的答案。 – user1566277 2012-08-01 09:55:19