【问题标题】:How to multiply a number with 3.5 without using any standard operator like *,-,/,% etc?如何在不使用 *、-、/、% 等标准运算符的情况下将数字与 3.5 相乘?
【发布时间】:2023-04-07 09:45:01
【问题描述】:

这个问题非常简单。我得到了一个数字,我想将它与 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)来说不是这样,尽管使用简单的逻辑完全可以做到这一点,因为这是微处理器可以使用的全部内容。跨度>
  • 如果答案是整数值,那么可以使用按位运算很好地解决。

标签: c++ bit-manipulation bitwise-operators


【解决方案1】:

抱歉,我还不能发表评论。您的问题的问题是按位运算通常仅在整数上完成。这主要是因为数字的存储方式。

当你有一个普通的 int 时,你有一个符号位,后跟一个数据位,非常简单直接,但是一旦你得到浮点数,简单的模式就不同了。这是一个很好的解释stackoverflow

另外,我不使用 +/-/*// 等来解决您的问题的方法是

#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;
        

        【讨论】:

          猜你喜欢
          • 2010-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-19
          • 2014-03-13
          • 2010-11-24
          相关资源
          最近更新 更多