方法一 用逻辑运算
a^b 表示a+b 中每位不进位的和,
(a&b) <<1 二进制加法 1&1=1,把1左移以为10,1+1=10,表示a+b 所有进位;
思想是
两个数字相加中能分解成
不进位的和 + 每一位相加的进位
a+b = a^b +(a&b)<<1
如果a&b==0的时候
a+b=a^b;
负整数运算也可以,因为补码运算,不存在减法。
所以反复迭代,一直到所有的进位为0
long add( long a, long b)
{
long carry ,sum;
sum=a^b; //不进位的和
carry=(a&b)<<1; //进位位
while(carry!=0)
{
a=(sum^carry);
b=(sum&carry)<<1;
sum=a;
carry=b;
}
return sum;
}
方法二
利用指针运算
只适应正整数,并且a, b ,a+b 均小于2^32-1;
看看数组 char array[b],array[b]如何取得 数据的第b+1的地址了,相当于address(array)+b
array[b]的地址,等于 address(array)+b
如果a=address(array),这样就可以完成加法运算
long add_address(int a,int b)
{
char * str=(char *)a;
return (long)(&str[b]);
}