为变量赋值的更好方法

时间:2014-11-24 14:34:54

标签: c optimization

所以我现在正在编写一些代码,这些代码将输出一个字符串,该字符串是根据变量中的位状态创建的。目前我的代码看起来像这些行

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);

这似乎是一种非常笨重的方法来实现这一点,我想知道是否有一个更短的方法可以完成同样的事情。

5 个答案:

答案 0 :(得分: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,并使用{{1在索引到值数组之前。

答案 1 :(得分:2)

虽然有一个较短的方式,但不是一个不同的方式......

使用三元运算符:

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

答案 2 :(得分: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' d)。

答案 3 :(得分:1)

假设声明(BITx& importantVariable)将始终返回0或1,您也可以使用:

  

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

答案 4 :(得分: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]);