思路
计算机语言中除了加减乘除运算之外,还有移位,异或,模运算这些位运算操作。不能使用加减乘除那肯定是用位运算操作实现了。
考虑计算机的加法运算,学过数字电路的应该知道加法器,下图是一个半加器电路:
- S = A xor B
- C = A and B
其真值表如下:
半加器计算 1+1
时
S = 1 xor 1 = 0
C = 1 and 1 = 1
进位C为1,所谓进位就是比S高一位, 所以最后结果是C左移一位之后与S异或得到最终结果,也就是10。
- 考虑如下例子:
5 + 7
num | reult | ||||
---|---|---|---|---|---|
5 | 0 | 1 | 0 | 1 | 5 |
7 | 0 | 1 | 1 | 1 | 7 |
n = 5 ^ 7(原来位的运算结果) | 0 | 0 | 1 | 0 | 2 |
m = (5 & 7) << 1(进位) | 1 | 0 | 1 | 0 | 10 |
n = n ^ m | 1 | 0 | 0 | 0 | 8 |
m = (n & m) << 1 | 0 | 1 | 0 | 0 | 4 |
n = n ^ m | 1 | 1 | 0 | 0 | 12 |
m = (n & m) << 1 | 0 | 0 | 0 | 0 | 0 |
当最后判断进位,m为0时,此时运算结束,得到最后结果。
C语言程序实现
#include<stdio.h>
// calculate num1 + num2
int add(int num1, int num2)
{
int sum, carry, result;
sum = carry = 0;
do
{
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}while (carry != 0)
return sum;
}
int mul(int num1, int num2)
{
}
int main()
{
}