首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三值逻辑和多路逻辑之间的联系?

三值逻辑和多路逻辑之间的联系?
EN

Stack Overflow用户
提问于 2011-02-27 20:18:05
回答 3查看 390关注 0票数 0

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

示例:

代码语言:javascript
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-27 20:26:13

三元运算符等同于分支:即不计算未返回的值。

我不知道你有多大的限制,所以请注意,布尔运算符&&||不会计算它们的第二个参数,因为结果可以从第一个参数确定。

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

票数 4
EN

Stack Overflow用户

发布于 2011-02-28 05:38:20

C编译器在三元语句之外创建分支。

使用Freescale的Codewarrior IDE,我编译了以下C程序:

代码语言:javascript
复制
int a, b, q, r;    
void main(void) {    
  a = 0;    
  b = 1;    
  q = 0;    
  r = q ? a : b;    
..
..    
}

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

代码语言:javascript
复制
...
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
EN

Stack Overflow用户

发布于 2011-02-28 05:56:41

通常,会创建分支逻辑,但如果两个值都被计算,则很有可能在没有任何类型分支的情况下执行三元运算。请考虑以下内容:

代码语言:javascript
复制
#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()作为汇编指令。但是,这两个值都会被求值,而三元?:不会这样做。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5133163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档