三进制逻辑和mux逻辑之间的联系?

问题描述 投票:0回答:3

我正在用 C 语言实现一个计算机模拟器,挑战是不使用条件语句(即没有 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;
c conditional-operator
3个回答
4
投票

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

我不知道你受到了多少限制,所以请注意,布尔运算符

&&
||
不会评估它们的第二个参数,因为结果可以从第一个参数确定。

(请注意,“MUX”行与其他两个表达式没有太大不同:它根据 q 中相应位的值从 a 或 b 中选择位,它不会根据 q 是否选择 a 或 b是否为空;编辑:更糟糕的是:您使用的是 !q 而不是 ~q...)。


1
投票

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

使用Freescale的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
...

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() 作为汇编指令执行。但是,这两个值都会被评估,而三元 ?: 则不会这样做。

根据情况,编译器通常会尝试做最快的事情,要么进行分支以避免冗余计算,要么在三元表达式中的值很简单时执行这种逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.