【发布时间】:2015-05-30 00:36:37
【问题描述】:
好的,所以我要做的就是将一个有符号整数乘以 2 并返回值。如果值溢出,则通过返回 Tmin 或 Tmax 来使其饱和。挑战在于仅使用这些逻辑运算符(!~ & ^ | + >)而不使用(if 语句、循环等),并且最多允许使用 20 个逻辑运算符。
现在我解决这个问题的思考过程是首先找到限制。所以我将 Tmin/max 除以 2 以获得边界。这是我所拥有的:
正面
这个和更高的作品:
1100000...
这个和更低的没有:
1011111...
如果它不起作用,我需要返回这个:
100000...
否定
这个和更低的作品:
0011111...
这个和更高版本没有:
0100000...
如果它不起作用,我需要返回这个:
011111...
否则我必须返回:
2 * x;
(顺便说一下,整数是 32 位的)
我看到前两位对于确定问题是否应该返回 2*x 或限制很重要。例如,异或会做,因为如果第一个到位相同,则应返回 2*x,否则应返回限制。整数的符号为负则需要另一个 if 语句,因为它是负数需要返回 Tmin,否则需要返回 Tmax。
现在我的问题是,如何在不使用 if 语句的情况下做到这一点? xD 或者一个更好的问题是我计划这个工作的方式,甚至在限制条件下可行?或者更好的问题是是否有更简单的方法来解决这个问题,如果有,如何解决?任何帮助将不胜感激!
【问题讨论】:
-
CPU 能够做到这一点,方法是执行宽乘法并将饱和值
cmoving 到结果中(如果高位非零)。但至于 C,我对此表示怀疑,而且它仍然比仅执行上述操作的库要慢。
标签: c bit-manipulation multiplication saturation-arithmetic