如何将int与分数相乘

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

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

我以为你会:

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

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


我需要向零舍入所以任何建议? 这不适用于数字-268435457。

你可能想要

 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 

你试过了吗:

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

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

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