如何使用位移执行 36 乘法?不是只能乘以2的幂吗?例如:
unsigned x = 4; // binary 00000000 00000000 00000000 00001000
unsigned y = x << 3; // multiply by 8, resulting in binary 00000000 ... 00100000
谢谢!
如何使用位移执行 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)
由于32
和分别是(和)4
的幂,您可以将它们作为单独的班次执行并添加结果。2
2^5
2^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);