是否有可能使用C将算术运算符乘以两个数字?使用左移运算符,我可以将任何数字乘以2。其他数字呢?乘法在C中没有算术运算符
6
A
回答
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
5
这是可能的,看到这个维基方向:http://en.wikipedia.org/wiki/Binary_multiplier
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. MySQL:算术运算符乘法
- 2. 算术运算符
- 3. C#中的算术运算
- 4. 在PHP(算术运算符)
- 5. 没有新的返回对象的C++算术运算符
- 6. c:没有*运算符的矩阵乘法
- 7. 在C++中有效的算术运算符重载11
- 8. C++运算符重载 - 指针,乘法
- 9. 混淆C++乘法运算
- 10. 如果运算符为C++算术
- 11. C++算术运算符错误
- 12. C编程!算术运算符操作
- 13. 重载乘法运算符
- 14. 在C++中的算术运算
- 15. 位运算符算术
- 16. 动态算术运算符
- 17. 推广算术运算符
- 18. 默认算术运算符
- 19. PHP算术运算符++
- 20. 算术运算符混淆
- 21. PHP算术运算(加法)
- 22. 执行算术运算在字符串在C#中
- 23. 为什么C#中的8位和16位整数没有算术运算符(+, - ,*,/,%)?
- 24. XOR乘法和算术运算的顺序
- 25. 算术运算
- 26. 算术运算
- 27. 算术运算
- 28. 算术运算
- 29. 算术运算
- 30. 不使用算术运算或按位运算符的加法
@Jens Gustedt哎,但答案是没有明确提及有正确!!!!!!!!!!!!! – chinchu
@Jens,这个问题不是关于乘二的问题,这个问题比这个问题更一般。 –
[使用按位运算符的两个整数的乘法](http://stackoverflow.com/q/4456442/995714) –