如何实现三元运算符? b:c不使用if else&分枝

时间:2014-07-04 09:29:30

标签: c bit-manipulation ternary-operator

我想在不使用if else语句的情况下实现三元运算符。 需要使用按位运算符而不使用三元运算符& if else声明。

a= true --> res = b
a= false --> res = c

4 个答案:

答案 0 :(得分:4)

您可能意味着您需要无分支源代码。请注意,当源代码中没有任何分支时,编译器可以自由地在程序集中引入分支,反之亦然。

不过,你可以写(!a) * c + (!!a) * b。为此表达式生成的程序集可能是也可能不是无分支的。我的编译器为它生成恰好无分支的代码(将CMOV指令计为无分支,就是这样):

~ $ cat f.c
int f(int a, int b, int c) {
  return (!a) * c + (!!a) * b;
}
~ $ gcc -O -S f.c && cat f.s
…
    testl   %edi, %edi
    setne   %al
    movzbl  %al, %eax
    cmovel  %edi, %esi
    orl $-2, %eax
    incl    %eax
    andl    %edx, %eax
    addl    %esi, %eax
    popq    %rbp
    ret
    .cfi_endproc

答案 1 :(得分:2)

res = a ? b : c;(如果b或c很复杂,可能会添加一些括号)

答案 2 :(得分:0)

使用

a?res=b:res=c 

你已经在问题标题中回答了自己。

答案 3 :(得分:0)

试试这个:

a && ((res = b), true);
a || ((res = c), true);

[补充]

我假设您只想使用按位运算符,而resabc都是n - 位有符号整数。然后你可能想试试这个:

res = (b & (((a | (~a + 1)) >> (n - 1)))) | (c & ~(((a | (~a + 1)) >> (n - 1))));

如果a等于n的最小值 - 比特有符号整数,例如-2^(n-1),则可能导致未定义的行为。但在大多数平台上,过流的结果是可逆的。