C中的乘法,没有算术运算符

时间:2011-07-28 10:18:49

标签: c math bitwise-operators multiplication

是否可以将两个数字相乘而不使用算术运算符?使用左移运算符,我可以将任意数乘以2。其他数字怎么样?

4 个答案:

答案 0 :(得分:12)

要解决这个问题,首先要做的是弄清楚如何使用按位运算符来进行简单的算术运算。

例如,可以使用此技术实现添加

int add(int a, int b) {
   int c;
   while (a != 0) {
      c = b & a;
      b = b ^ a;
      c = c << 1;
      a = c;
   }
   return b;
}

然后是使用加法进行乘法的问题:

int mult(int a, int b) {
   int i = 0;
   int c = 0;
   while (i < b) {
      c = add(c, a);
      i = add(i, 1);
   }
   return c;
}

如果b为负数,则此乘法还不起作用,但由于这看起来像是一个作业问题,我将把它作为练习留给你。 ;)

编辑: 虽然乘法在添加后很直观,但添加功能并不那么容易理解,所以我在这里解释一下。

让我们假设您要添加两个数字,11010011和10101.通常的方法是将它们排成一行:

11010011
 + 10101

您会注意到,当您添加两个二进制数时,如果两个数字中的第i位为1,则结果位为0,并且在i的左侧有一个位。 / p>

这个携带是变量&#39; c&#39;在代码商店。

//...
c = b & a;
//...
c << 1;
//...

我们有点明智,b和a只得到a和b都为1的位,然后我们将它移位1来得到进位。

然后你可以看一下a和b不同的位,即其中一位是1而另一位是0.在这种情况下,结果位为1,没有进位。

这条线存储的内容:

b = b ^ a;

上面的行基本上删除了a和b都为1的位(现在存储在c中)。

所以现在你还有另外两个数字b和c,你需要加在一起。

首先让我们看一下循环第一次迭代后我们在这个例子中的位置

c = a = 00100010
    b = 11000110

它可能还不完全明显,但是b正在积累得到的总和。通过循环的更多迭代,更多的位被加载&#34;添加&#34;回到b,再次将行李存放在c中。从这个意义上讲,您可以将xor运算符视为无需进位的加法运算。

这是该循环的第二次迭代:

c = a = 00000010
    b = 11100100

第3次迭代:

c = a = 00000000
    b = 11100110

现在c(和a)为0,所以没有更多的进位添加。我们退出循环并返回b。请注意,即使您继续循环,也不会改变任何数字。

答案 1 :(得分:5)

有可能,请参阅此Wiki以获取方向:http://en.wikipedia.org/wiki/Binary_multiplier

答案 2 :(得分:3)

void main()
{ 
  int n1, n2, n3, n4, x, y, i;
  printf("Enter first number");
  scanf("%d", &n1);
  printf("Enter second number");
  scanf("%d", &n2);
  n3 = n2;
  n4 = n2;
  n1-=1;
  for(i = n1;i > 0;i-=1)
  { 
    do { 
      x = n2 & n3; 
      y= n2 ^ n3; 
      n2 = x << 1; 
      n3 = y; 
    } while (x);
    n2 = y;
    n3 = n4;
  }
  printf("product of two number is %d", y);
  getch();
}

答案 3 :(得分:2)

是的,这是可能的。您可以使用逻辑运算符执行此操作。毕竟,这就是硬件在使用算术运算符时所做的一切。