2011-07-12 120 views
1

我有關於位掩碼中的問題,並用C位掩碼和移位運算

uint32_t reg_val = 0xffffffff; 

if(1 == ((reg_val & BIT12)>>12)) 
{ 
    //DO SOMETHING. 
} 

移位運算符,其中BIT12是(1 < < 12)。 問題是右移12是否真的有必要。如果不是這樣,因爲如果BIT12設置在reg_val中,則表達式(reg_val & BIT12)的邏輯值爲'1',如果BIT12在reg_val中清除,則邏輯值爲'0' ?從可讀性的角度來看,它也是推薦的編碼習慣。

回答

7

這是不必要的

if (reg_val & BIT12) // would be sufficient 
{ 
    //DO SOMETHING. 
} 

現在,上面的作品,因爲BIT12假定只有一個非零位。一個更通用的方式來處理這種測試將

if ((reg_val & BIT12) == BIT12) 
{ 
    //DO SOMETHING. 
} 

這樣做的原因是,第一個片段只有測試,如果reg_val AND-ED與BIT12爲非零(即reg_val和BIT12至少有一個非零位共同)。第二個片段測試所有在BIT12中設置的位也在reg_val中設置。

2

右移是必要的,因爲&的結果將是1<<12,而您正在比較1是1<<0

取代比較1,您可以與而不是0(即:0 !=...)進行比較,然後跳過右移。

1

右移12是沒有必要的,但它很好,因爲您可以將它與1而不是4096(難以記住並且確切地告訴代碼在做什麼)進行比較,但由於您已經有BIT12代之以使用它是可以的。

+0

1 << 12 = 4096 :) –

+0

@邁克爾:對XD我記得當時我想:「但它基本爲零,所以2〜11的動力,不要搞砸:) :)「 – Ryan

1

你當然可以寫 if (0 != reg_val & BIT12) ... if (BIT12 == reg_val & BIT12) ...