如何使用位移执行乘法36?是不是只能乘以2的幂?例如:
unsigned x = 4; // binary 00000000 00000000 00000000 00001000
unsigned y = x << 3; // multiply by 8, resulting in binary 00000000 ... 00100000
谢谢!
答案 0 :(得分:6)
单独通过位移不能乘以2的非幂。
但你可以使用加法和乘法来分解它:
x * 36 = x * (32 + 4)
= (x * 32) + (x * 4)
由于32
和4
分别是2
(2^5
和2^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);