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

时间:2013-09-07 05:08:54

标签: c bit-manipulation bitwise-operators bit

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

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

谢谢!

2 个答案:

答案 0 :(得分:6)

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

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

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

由于324分别是22^52^2的权力),您可以将其作为单独的班次执行并添加结果。

答案 1 :(得分:2)

你不能单独换位。正如您所说,对二进制数进行位移只能乘以或除以2的幂。类似地,您只能通过位移乘以或除以十进制数的十进制数(例如,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);