2

如何使用位移执行 36 乘法?不是只能乘以2的幂吗?例如:

unsigned x = 4; // binary 00000000 00000000 00000000 00001000
unsigned y = x << 3; // multiply by 8, resulting in binary 00000000 ... 00100000

谢谢!

4

2 回答 2

6

您不能仅通过位移来乘以 2 的非幂。

但是你可以使用加法和乘法来分解它:

x * 36 = x * (32 + 4)
       = (x * 32) + (x * 4)

由于32和分别是(和)4的幂,您可以将它们作为单独的班次执行并添加结果。22^52^2

于 2013-09-07T05:15:38.403 回答
2

您不能单独进行位移。正如您所说,对二进制数进行位移只能乘以或除以 2 的幂。同样,您只能通过移位将十进制数乘以或除以 10 的幂(例如,3 可以变为 30、300、0.3 或 0.03,但不能变为 0.02 或 99)。


但是您可以将 36 分解为 2 的幂的总和。

也就是可以把36拆分成32+4,也就是2^5+2^2。根据您使用的措辞(“编写使用移位的代码”),唯一的要求是使用位移位,只要满足此要求,就应该允许执行其他操作。

那是,

x * 36 = x * (32 + 4) = 32x + 4x = (2^5)x + (2^2)x = (x << 5) + (x << 2)

有了这种理解,最简单的实现就是添加两个移位的值:

int result = (x << 5) + (x << 2);
于 2013-09-07T05:14:57.980 回答