2011-07-28 45 views
6

是否有可能使用C将算术运算符乘以两个数字?使用左移运算符,我可以将任何数字乘以2。其他数字呢?乘法在C中没有算术运算符

+2

@Jens Gustedt哎,但答案是没有明确提及有正确!!!!!!!!!!!!! – chinchu

+1

@Jens,这个问题不是关于乘二的问题,这个问题比这个问题更一般。 –

+0

[使用按位运算符的两个整数的乘法](http://stackoverflow.com/q/4456442/995714) –

回答

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(); 
} 
2

是的,这是可能的。你可以用逻辑运算符来完成。毕竟,当你使用算术运算符时,这就是硬件的全部功能。

+1

好吧,如果你不介意,你可以写代码:-) – chinchu

+1

@chinchu你会学到什么,如果我们做你的为你做作业? –

+1

@ David Heffernan没有这样的:-) ..我尝试了很多次,以获得这个..我不得不问这里的解决方案.. :-) – chinchu

10

为了解决这个问题,你要做的第一件事是弄清楚如何让只用位运算符简单的算术运算。

例如,除了可以使用这种技术

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左边的位。

该进位是代码中存储的变量'c'。

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

我们比特明智的,b和a只得到a和b都是1的位,然后我们左移一位得到进位位。

然后您可以查看a和b不同的位,即其中一个位是1,另一个位是0.在这种情况下,得到的位将是1,不带进位。

这就是这行存储:

b = b^a; 

以上实质上的线去除其中两个a和b是1(现在存储在c)中的位。

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

首先让我们看看我们在用例中循环

c = a = 00100010 
    b = 11000110 

它可能不是完全明显但第一次迭代之后在那里,而B则累计相加结果。通过循环的更多迭代,将结转的更多比特“添加”回b,并将进位再次存储在c中。从这个意义上讲,你可以把xor算子看作是一个无需进位的加法运算。

下面是循环的第二次迭代:

c = a = 00000010 
    b = 11100100 

第三次迭代:

c = a = 00000000 
    b = 11100110 

现在C(和)为0,所以没有更多的随身补充。我们退出循环并返回b。请注意,即使你继续循环,所有数字都不会改变。

+1

@ charles Ma嗨很好的解决方案..感谢你很多...有一个gud的日子:-) – chinchu

+1

非常欢迎: ) –

+1

再次非常感谢清楚解释.. :-) – chinchu