//位运算实现加法(整数部分)
/*
设: x = 5(101) y = 6(110)
则:先通过 异或( ^ )完成“逢二不进一” 在通过按位与( & )主要判断两边是1的情况 在进行左移( << )完成进位,如下。
1: 101 2: 101 3: 0011 4: 0011
^ 110 & <<1 110 ^ 1000 & <<1 1000
011 1000 1011 0000
结果为:1011
*/
int add(int a,int b)
{
while (b)
{
int temp = a^b;
b = (a&b)<< 1;
a = temp;
}
return a;
}
//减法部分
/*
减法就跟简单了,我们只用把b变成负数,当作加法来用.如下:
设: x = 5(101) y = 6(110)
5 + (-6) = -1 和 5 - 6 = -1
5 + 6 = 11 和 5 - (-6) = 11 是等价的;
*/
int sub(int a,int b)
{
b = ~b + 1; //求补码;
return add(a, b);
}
//乘法部分
/*
乘法和加法一样了..例如
2 * 3 = 3 + 3
*/
int mult(int a,int b)
{
int temp = 0;
while (a)
{
temp = add(temp, b);
a = sub(a, 1);
}
return temp;
}
//除法部分
/*
除法和乘法一样不做多解释了
*/
int divson(int a, int b)
{
int cnt = 0;
while (b <= a)
{
a = sub(a, b);
cnt++;
}
return cnt;
}
int main()
{
int x = 10, y = 2;
printf("%d + %d = %d\n",x,y,add(x, y));
printf("%d - %d = %d\n",x,y,sub(x, y));
printf("%d * %d = %d\n",x,y,mult(x, y));
printf("%d / %d = %d\n",x,y,divson(x, y));
system("pause");
return 0;
}