如何将int与分数相乘

时间:2011-09-09 03:42:09

标签: c binary logic bit-manipulation

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

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

我以为你会:

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

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


我需要向零舍入所以有任何建议吗?这对于数字-268435457不起作用。

3 个答案:

答案 0 :(得分:5)

你可能想要

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

答案 1 :(得分:1)

你有没有尝试过:

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

即。在第二个语句中将'x'替换为'value'。此外,值将忽略小数点。

答案 2 :(得分:0)

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