2016-12-04 55 views
0

我已經11個標誌定義爲:最有效的方法,如果標記被一個整數設置

#define F1 1 
#define F2 2 
#define F3 3 
#define F4 4 
... 
#define F11 11 

在一些函數然後創建的整數,其可以包括任一這些標記的,例如:

int a = (1 << F1) | (1 << F5) | (1 << F11) | (1 << F8); 

然後,這被傳遞到一個函數,該函數需要解碼哪些標誌被設置,以設置特定寄存器中的特定位。所以我的問題是,什麼是檢查設置哪個標誌的最有效的方法。現在我有11如果像:

void foo(int a) 
{ 
    if ((a & (1 << F1)) >> F1) { 
     // Set bit 5 in register A. 
    } 

    if ((a & (1 << F2)) >> F2) { 
     // Set bit 3 in register V. 
    } 

    if ((a & (1 << F3)) >> F3) { 
     // Set bit 2 in register H. 
    } 

    if ((a & (1 << F4)) >> F4) { 
     // Set bit 1 in register V. 
    } 

    // And so on, for all 11 flags. 
} 

P.S. 這是一個8位微控制器。

+0

@ M.M是的,你是對的。我修好了它。 – user1806687

回答

2

只需使用:

typedef enum{ 
    FLAG1 = 1, // or 0x01 
    FLAG2 = 2, 
    FLAG3 = 4, 
    ... 
    FLAG8 = 0x80 
} flags; 

然後在主只檢查

if(value & FLAGN) 

在C存在和if語句任何其他號碼1之間沒有diffrence。它只是檢查是否爲零或非零數字。

和設置是一樣的:

value = FLAG1 | FLAG2 | FLAG8; 

您還可以使用定義OFC。

而對於claryfication,N位類型的最大標誌數是N.所以你需要有更大的類型(如果compiller支持更大的數據類型),比如uint16_t。

2

C'S if語句和邏輯運算符不作1和其他非零點之間的差異(儘管邏輯運算符產生1true)。因此,在邏輯表達式的上下文中,(a & (1 << F3)) >> F3a & (1 << F3)之間沒有區別:如果其中一個的計算結果爲true,反之亦然。因此,這應該工作:

if (a & (1 << F1)) { 
    // Set bit 5 in register A. 
} 

注:我相信你不是故意寫#define F11 1024,而是#define F11 10,因爲你用你的F S作爲的<<第二個操作數。

相關問題