我需要将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
我的问题:是否可以将代码块转换为一个表达式(使用算术和/或逻辑运算)?为什么或为什么不呢?
答案 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
和正确预测的分支)可能会表现更好,我的代码也会表现出更好的更一致的表现。