如何在不使用 *、-、/、% 等标准运算符的情况下将数字与 3.5 相乘?
Posted
技术标签:
【中文标题】如何在不使用 *、-、/、% 等标准运算符的情况下将数字与 3.5 相乘?【英文标题】:How to multiply a number with 3.5 without using any standard operator like *,-,/,% etc? 【发布时间】:2016-01-19 08:09:23 【问题描述】:这个问题非常简单。我得到了一个数字,我想将它与 3.5 相乘,即得到数字 n=3.5n。我不允许使用任何运算符,例如 +,-,*,/,% 等等。但是我可以使用位运算符。
我自己尝试过,但它没有给出精确的结果,就像我的程序给出的输出 17 for 5* 3.5 这显然是错误的。如何修改我的程序以显示正确的结果。 p>
#include<bits/stdc++.h>
using namespace std;
double Multiply(int n)
double ans=((n>>1)+ n + (n<<1));
return ans;
int main()
int n; // Enter the number you want to multiply with 3.5
cin>>n;
double ans=Multiply(n);
cout<<ans<<"\n";
return 0;
【问题讨论】:
即使你的函数有效,它也使用+
,你说这不是本次作业的一部分?
哦,是的。也许你可以告诉我怎么做。
也许投反对票的人想告诉我我的问题有什么问题,以便我改进:)
您确定该任务是针对浮点值执行此操作的吗?这真的不容易——至少对于任意范围的浮点数(例如 0.001 * 3.5 和 1E30 * 3.5)来说不是这样,尽管使用简单的逻辑完全可以做到这一点,因为这是微处理器可以使用的全部内容。跨度>
如果答案是整数值,那么可以使用按位运算很好地解决。
【参考方案1】:
抱歉,我还不能发表评论。您的问题的问题是按位运算通常仅在整数上完成。这主要是因为数字的存储方式。
当你有一个普通的 int 时,你有一个符号位,后跟一个数据位,非常简单直接,但是一旦你得到浮点数,简单的模式就不同了。这是一个很好的解释***。
另外,我不使用 +/-/*// 等来解决您的问题的方法是
#include <stdlib.h> /* atoi() */
#include <stdio.h> /* (f)printf */
#include <assert.h> /* assert() */
int add(int x, int y)
int carry = 0;
int result = 0;
int i;
for(i = 0; i < 32; ++i)
int a = (x >> i) & 1;
int b = (y >> i) & 1;
result |= ((a ^ b) ^ carry) << i;
carry = (a & b) | (b & carry) | (carry & a);
return result;
int negate(int x)
return add(~x, 1);
int subtract(int x, int y)
return add(x, negate(y));
int is_even(int n)
return !(n & 1);
int divide_by_two(int n)
return n >> 1;
int multiply_by_two(int n)
return n << 1;
Source
【讨论】:
【参考方案2】:根据您的解决方案,您可以手动处理奇数:
double Multiply(unsigned int n)
double = n + (n << 1) + (n >> 1) + ((n & 1) ? 0.5 : 0.);
return ans;
但它仍然使用+
【讨论】:
【参考方案3】:一种解决方案是使用fma()
from <cmath>
:
#include <cmath>
double Multiply(int n)
return fma(x, 3.5, 0.0);
LIVE DEMO
【讨论】:
【参考方案4】:很简单。
首先意识到 3.5 = 112 / 32 = (128 - 16) / 32。
比你做的:
int x128 = ur_num << 7;
int x16 = ur_num << 4;
减去它们使用:
int add(int x, int y)
int carry = 0;
int result = 0;
int i;
for(i = 0; i < 32; ++i)
int a = (x >> i) & 1;
int b = (y >> i) & 1;
result |= ((a ^ b) ^ carry) << i;
carry = (a & b) | (b & carry) | (carry & a);
return result;
int negate(int x)
return add(~x, 1);
int subtract(int x, int y)
return add(x, negate(y));
而不仅仅是简单地做:
int your_res = subtract(x128, x16) >> 5;
【讨论】:
以上是关于如何在不使用 *、-、/、% 等标准运算符的情况下将数字与 3.5 相乘?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 numpy 的情况下计算 python 中的标准偏差?
如何在不使用 StandardScaler 的情况下标准化 PySpark 中的列?