题目:
写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
分析:
由于不能使用四则运算,我们可以考虑使用其他的操作,考虑是用位操作,来模拟加法操作,首先不考虑进位,使用异或操作,然后再考虑进位,使用与操作,再将进位与异或的结果进行相加,由此循环,进位为0停止。
算法代码如下:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int main()
{
int a, b;
a = 0xffff;
b = 0xffff;
int xor_val; //保留异或结果
int and_val; //保留与结果
do
{
xor_val = a ^ b;
and_val = a & b;
b = and_val << 1; //进位标志左移位,赋值给b
a = xor_val; //新的异或结果赋值给a
}while(b != 0);
printf("%x\n", a);
return 0;
}
同样的,我们可以使用位操作来进行减法操作,算法代码如下:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int main()
{
int a, b;
a = 0;
b = 1;
int xor_val; //保留异或结果
int and_val; //保留与结果
do
{
xor_val = a ^ b;
and_val = (~a) & b;
b = and_val << 1; //借位标志左移位,赋值给b
a = xor_val; //新的异或结果赋值给a
}while(b != 0);
printf("%d\n", a);
return 0;
}
思路和加法一样,需要修改的地方是借位位置,使用and_val = (~a) & b,这里和加法略有不同。
总结:
善于使用C语言中的位操作,可以使程序变得简洁、高效。