所以我现在正在编写一些代码,这些代码将输出一个字符串,该字符串是根据变量中的位状态创建的。目前我的代码看起来像这些行
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);
这似乎是一种非常笨重的方法来实现这一点,我想知道是否有一个更短的方法可以完成同样的事情。
答案 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]);