2014-11-24 113 views
1

因此,我目前正在編寫一些代碼,它將輸出一個字符串,該字符串是基於變量中位的狀態創建的。目前我的代碼看起來東西沿着這些路線更好的方法爲變量賦值

uint8_t importantVariable; 

if(BIT0&importantVariable){ 
    valA = 'A'; 
else{ 
    valA = 'B'; 
} 
if(BIT1&importantVariable){ 
    valB = 'A'; 
else{ 
    valB = 'B'; 
} 
if(BIT2&importantVariable){ 
    valC = 'A'; 
else{ 
    valC = 'B'; 
} 

printf(examplestring, "valA is %c, valB is %c, valC is %c",ValA,ValB,ValC); 

這似乎是一個很笨重的方式然而,做到這一點,我想知道是否有可能完成同樣的事情更短的方法。

回答

3

您可以爲每個位創建一個可能值的數組,並使用位移和掩碼的組合來獲得合適的值。

下面是一個例子:

// Rather than defining a mask, say, 0x04, define the number of right shifts 
// for the corresponding bit to get into the LSB position: 
#define BIT3_SHIFT 2 

static char bit3_values[] = {'A', 'B'}; 
... 
valA = bit3_values[(importantVariable >> BIT3_SHIFT) & 1]; 

這種方法可以讓你移動目標值到數組的初始化,使他們的代碼不再一部分。它也消除了條件執行。

它還允許您對幾個連續位的組合進行操作。例如,如果您希望根據位6和位7的組合指定四個值中的一個,則可以定義一個四元素值的數組,將importantVariable移6,並使用0x03進行掩碼,然後將其編入數組值。

2

有一個較短的方式,而不是一種opmitization雖然...

使用三元運算:

valA = BIT0&importantVariable ? 'A' : 'B'; 
1

另一種可能性,以避免else秒。

char valA = 'B'; 
char valB = 'B'; 
char valC = 'B'; 

if(BIT0&importantVariable) 
    valA = 'A'; 
if(BIT1&importantVariable) 
    valA = 'A'; 
if(BIT2&importantVariable) 
    valA = 'A'; 

雖然我更喜歡三元運算符(即我已+1)。

1

Asuming聲明(BITX & importantVariable)將總是返回0或1,你也可以使用:

valx = 'B' - (BITX & importantVariable);

0

如果相關的位是連續的位,那麼你可以做一些更通用:

char values[3] = { 0 }; 
for (int i = 0; i < 3; i++) 
{ 
    int bit = 1 << i; 
    values[i] = bit & importantVariable; 
} 
printf(examplestring, "valA is %c, valB is %c, valC is %c", values[0], values[1], values[2]);