将简单的if / else转换成表达式?

时间:2019-08-15 23:31:11

标签: logic

我需要将2位数字从一个定义映射到另一个(以下数字代表位):

var newVal = new ValueProviderResult("updated value", "updated value", CultureInfo.InvariantCulture);
ModelState.SetModelValue("MyFieldName", newVal);

这可以通过C / C ++中的简单00 -> 00 01 -> 10 10 -> 11 11 -> 01 块来完成,例如

if/else

我的问题:是否可以将代码块转换为一个表达式(使用算术和/或逻辑运算)?为什么或为什么不呢?

1 个答案:

答案 0 :(得分:1)

(请注意,根据您的代码示例,我将在此处假设一种类似C的语言,该语言具有按位操作-无论如何,大多数语言都具有此类操作符。如果您的语言不是C或未使用这些特定的操作员,请使用特定语言更新您的问题。)

当然,这绝对是可能的。基于此,我们可以知道输出的LSB等于输入的MSB,因此该位很容易进行右移计算(如果输入大于3,则隔离LSB以确保安全)。 :

(n >> 1) & 1

输出的MSB可以表示为两个输入位的二进制XOR。因此,我们将对n本身进行XOR左移一位,然后隔离第二位。

(n ^ (n << 1)) & 2

然后我们使用二进制OR将其与第一个表达式组合在一起:

((n ^ (n << 1)) & 2) | ((n >> 1) & 1)

(在C ++中为{Demo。)


您可能会问哪个更好。答案是,我认为您的代码示例在维护方面要好得多,因为我编写的表达式非常不透明,即使您了解按位运算符的功能,也需要进行一些解密。对于必须维护该程序的其他人来说,您的代码不太可能成为问题。

如果高性能绝对至关重要(提示:可能不是),那么我的代码将执行得更快。在经过全面优化的clang 4.0.0上,我的代码不仅编译成更少的指令,而且(更重要的是)没有分支或条件操作;您的代码有两个这样的指令。假设CPU正确预测了分支,那么在n==0时,您的代码将执行得更快,而在n!=0时,您的代码将执行得差不多。但是,如果这两种情况下CPU错误地预测了分支,它的性能都会变差。

tl; dr是,即使您的代码在某些情况下(n==0和正确预测的分支)可能会表现更好,我的代码也会表现出更好的更一致的表现