三元逻辑和多路复用逻辑之间的连接?

时间:2011-02-27 12:18:05

标签: c compiler-construction ternary-operator

我在C中实现了一个计算机模拟器,其挑战是不使用条件(即if if / else,switch / case,while / for等)。我正在模拟的硬件中有很多多路复用器,所以如果我可以使用条件三元逻辑运算符会很好。那么,我的问题是:C编译器是否从三元逻辑运算符创建MUX逻辑,还是创建分支?

示例:

int a, b, q, r;
/* Ternary logic */
r = q ? a : b;
/* MUX equivalent logic */
r = ( q & a ) | ( (~q) & b )
/* Branch equivalent logic */
if (q) r = a; else r = b;

3 个答案:

答案 0 :(得分:4)

三元运算符相当于一个分支:即未评估未返回的值。

我不知道你有多少受限制,所以请注意布尔运算符&&||不评估它们的第二个参数是结果可以从第一个确定。

(并注意你的行“MUX”与其他两个表达式没有什么不同:它根据q中相应位的值从a或b中选择位,它不会选择a或b取决于如果q为null或不;编辑:更糟糕的是:你正在使用!q而不是〜q ...)。

答案 1 :(得分:1)

C编译器用三元语句创建分支。

使用飞思卡尔的Codewarrior IDE,我编译了以下C程序:

int a, b, q, r;    
void main(void) {    
  a = 0;    
  b = 1;    
  q = 0;    
  r = q ? a : b;    
..
..    
}

对应于三元语句的程序集如下:

...
LDX    0x1104 ; load val[q] into register x    
BNE    *+4    ; branch to abs addr 0xC016 if val[q]==a    
BRA    *+5    ; branch to abs addr 0xC019 if val[q]!=a
...

答案 2 :(得分:1)

通常,会创建分支逻辑,但如果您对两个值都进行评估,那么很可能在没有任何分支的情况下进行三元运算。考虑一下:

#include <stdio.h>

static inline int isel(int cond, int a, int b)
{
   int mask = cond | (-cond);
   mask >>= 31;
   return (b & mask) | (a & ~mask);
}

int main(void)
{
   printf("1 ? 3 : 4 => %d\n", isel(1, 3, 4));
   printf("0 ? 3 : 4 => %d\n", isel(0, 3, 4));
   printf("-1 ? 3 : 4 => %d\n", isel(-1, 3, 4));
   return 0;
}

此代码假定有符号数字的右移将进行符号扩展,并且sizeof(int)== 4。 某些处理器可以将isel()作为汇编指令。但是,这两个值都将被评估,其中三元组:?不会。

根据具体情况,编译器通常会尝试做最快的事情,分支以避免冗余计算,或者如果三元表达式中的值很简单,则执行此类逻辑。