【问题标题】:How to multiply an int with a fraction如何将整数与分数相乘
【发布时间】:2011-11-13 11:45:36
【问题描述】:

我需要使用不带循环等的按位运算符将 int 乘以分数。

例如,我需要将 x 乘以 3/8。

我以为你会:

int value = (x << 1) + x;  // Multiply by 3
value = (value >> 3);          // Divide by 8

但这不起作用。我尝试使用谷歌搜索二进制时间分数,但给出了浮点示例。我不确切知道这个作业是否适用于浮点,但我的预感不是,但让我为它做好准备。那么有什么建议吗?


我需要向零舍入,有什么建议吗?这不适用于号码 -268435457。

【问题讨论】:

  • 你是说更新后的代码还是不行? x 是 int 吗?另外,您尝试过的x 的值是多少以及生成的value
  • 这还是不行吗?!您从下面的解决方案中进行了编辑,看起来像...
  • 解决方案向上而不是向下舍入,朝向 0。

标签: c binary logic bit-manipulation


【解决方案1】:

你可能想要

int value = (x << 1) + x;
value = (value >> 3);

注意:

(x << 1) + 1 = 2*x + 1; // ignoring issues about overflow

要调整负值,您可以显式检查符号:

int value = (x << 1) + x;
value = value >> 3;
value = value + ((x >> 31) & 1); // for 32 bit; for 64 bit you have to use x >> 63

【讨论】:

  • 然后是'value = (value >> 3)'
  • @Andrey 已更新(认为这很明显,但应说明完整性)
  • 数字 -268435457 是错误的。我返回 -100663297 但应该返回 -100663296。它正在四舍五入。我怎样才能四舍五入?
  • 您正在尝试使用负值。您可以检查符号并否定最终结果,或者显式添加符号位。我会更新我的回复
  • 如果实际结果为负整数,此方​​法不起作用。 -24 的输入给出 -8 而不是 -9。
【解决方案2】:

你试过了吗:

int value = (x << 1) + x;  // Multiply by 3
value = (value >> 3);      // Divide by 8

即在您的第二个语句中,将“x”替换为“值”。此外,值会丢失小数点。

【讨论】:

  • 我想忽略小数点并向下舍入,这与忽略它们相同。
【解决方案3】:

为避免溢出,您可以转换为 (long long) 并返回 (int) 以获得最终结果。要使&gt;&gt; 3 向零舍入,您需要为负数添加 7 (8-1)。有几种方法可以做到这一点。使用这些方法可以得到 -100663296。

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多