【问题标题】:bit shift multiplication in c not using powers of 2 [duplicate]c中的位移乘法不使用2的幂[重复]
【发布时间】:2013-09-07 05:08:54
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 是的,位移是 2 的幂
  • y=(x&lt;&lt; 5) + (x &lt;&lt;2)

标签: c bit-manipulation bitwise-operators bit


【解决方案1】:

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

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

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

由于3242 的幂(分别为2^52^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);

【讨论】:

  • @P0W 是的,我就是这个意思。
  • 很好的解释。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多