c中的位移乘法不使用2的幂

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

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

谢谢!

你不能单独通过位移乘以2的非幂。

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

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

由于3242幂(分别为2^52^2 ),您可以将它们作为单独的移位执行并添加结果。

你不能单独换位。 正如您所说,对二进制数进行位移只能乘以或除以2的幂。 类似地,您只能通过位移乘以或除以10的幂的十进制数(例如,3可以变为30,300,0.3或0.03,但绝不会是0.02或99)。


但你可以将36分降为两个权力的总和。

也就是说,你可以将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);