使用加,减和左移来翻转二进制补码的符号

时间:2012-09-11 20:29:13

标签: twos-complement

在家庭作业中,其中一个问题要求我们将任意整数乘以一个常数,只使用+, - 和<<操作员和最多三个操作。例如,第一个常数是17,我解决了

(x << 4) + x

然而,给出的一些常数是负的(例如-7)。乘以7是一件相对微不足道的事情(我将其作为(x << 3) - x),但我无法弄清楚如何仅使用三个允许的运算符来翻转符号。

我试图通过在每个结果中添加或减去2147483648来翻转该位(这意味着这将强制使用最重要的位,从而翻转符号),但是在我的C#测试实现中,这有证明不成功。

是否有一些正数可以乘以给定的int,它在功能上类似于-7?是否会添加2147483648以C#以外的语言工作?我忽略了什么吗?

本书的原始问题如下:

  

假设我们被赋予生成代码的任务,以通过各种不同的常数因子K乘以整数变量x。为了有效,我们只想使用操作+, - 和&lt;&lt;。对于以下K值,编写C表达式以使用每个表达式最多三次运算来执行乘法。

     

一个。 K = 17

     

B中。 K = -7

     

℃。 K = 60

     

d。 K = -112

2 个答案:

答案 0 :(得分:3)

您无需更改标志。您将7 * x写为(相当于)8*x - x。现在,你需要做些什么才能获得-7 * x

答案 1 :(得分:0)

x - (x << 3)无效吗?