写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
看到这种题,第一感觉就是必须要用位操作符来实现,既然不能通过符号运算,就必然是二进制位的移动来进行运算。
先举个10进制的例子:
10+5怎么运算?
各位相加,得5小于10,不进位,十位相加,1+0=1;得到15.
15+7呢?
各位相加,得2进1,十位相加,1+1=2,得到22
十进位数可以分解为进位数+不进位数
同理,二进制也可以这样算
先进行两个数的不进位计算后的二进制序列,再得到进位的二进制序列
两者相加得到两数和
为了便于书写,取8位比特位进行分析:
0001 0110就是22的二进制序列,运算结束。
怎么获得不进位相加的结果和应进的位呢?
我们发现a^b得到的就是不进位相加的结果
a&b再左移一位就是应进得位
所以代码便可以实现:
int main()
{
int a, b;
scanf("%d %d", &a, &b);
while (b != 0)//进位为0时循环终止
{
int tmp = a ^ b;//不进位加法
b = (a & b) << 1;//应进的位
a = tmp;
}
printf("%d\n", a);
return 0;
}