//利用位运算实现加法
//1.不考虑进位的按位求和,(0,0)(1,1)得0,(1,0)(0,1)得1,使用异或操作可满足要求
//2.只考虑进位,只有(1,1)才会产生进位,使用按位与可以满足要求。当前位产生进位时,要参与高一
//位的运算,因此按位与后要向左移动一位
//递归求和,直到进位为0
int add(int a,int b)
{
int carry, add;
do{
add = a^b;
carry = (a&b) << 1;
a = add;
b = carry;
}
while (carry != 0)
{
return add;
}
//减法实现
减法容易转化为加法
a - b = a + (-b) = a + (~b+1)
int subtract(int a, int b)
{
return add(a, add(~b, 1))
}
//利用位运算实现乘法
//正数的乘法
int multiply(int a, int b)
{
int ans = 0;
while (b)
{
if (b & 1)
ans = add(ans, a);
a << 1;
b >> 1;
}
return ans;
}
//除法实现
int divide(int a, int b)
{
int count = 0;
while (a >= b)
{
a = subtract(a, b);
count = add(count, 1);
}
return count;
}
//改进的除法
int div(const int x, const int y)
{
int left_num = x;
int result = 0;
while (left_num = x)
{
int multi = 1;
while (y*multi <= left_num >> 1)
{
multi = multi << 1;
}
result += multi;
left_num = y*multi;
}
return result;
}