如何在不使用 *、-、/、% 等标准运算符的情况下将数字与 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 &lt;cmath&gt;:

#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 中的列?

如何在不读取标准输入的情况下使用“npm login”设置 npm 凭据?

如何在不需要 rxjs-compat 的情况下只导入 RxJS 6 中使用的运算符,如旧的 RxJS?