直接上代码吧
/// <summary>
/// 加法
/// </summary>
/// <param name="_a"></param>
/// <param name="_b"></param>
/// <returns></returns>
static int Add(int _a, int _b)
{
if (_b==0)
{
return _a;
}
else
{
return Add(_a ^ _b, (_a & _b) << 1);
}
}
/// <summary>
/// 减法
/// </summary>
/// <param name="_a"></param>
/// <param name="_b"></param>
/// <returns></returns>
static int Minus(int _a, int _b)
{
int num = ~_b + 1;
return Add(_a, num);
}
/// <summary>
/// 乘法
/// </summary>
/// <param name="_a"></param>
/// <param name="_b"></param>
/// <returns></returns>
static int Multiply(int _a, int _b)
{
int num = 0;
if (_b < 0)
{
_b = ~_b + 1;
_a = ~_a + 1;
}
#region 累加法
//while (_b>0)
//{
// num=Add(num, _a);
// _b--;
//}
#endregion
#region 位运算法
int index=0;
while (_b!=0)
{
if ((_b & 1)==1)
{
num = Add(num, _a << index);
}
_b=_b >> 1;
index++;
}
#endregion
return num;
}
/// <summary>
/// 除法
/// </summary>
/// <param name="_a"></param>
/// <param name="_b"></param>
/// <returns></returns>
static int Divide(int _a, int _b)
{
int num = 0;
bool f = (_a > 0 && _b > 0) || (_a < 0 && _b < 0);
//取绝对值
if (_a<0)
{
_a = ~_a + 1;
}
if (_b < 0)
{
_b = ~_b + 1;
}
#region 累减法
//while (_a>=_b)
//{
// _a = Minus(_a, _b);
// num++;
//}
#endregion
#region 位运算法
/* num= a/b
* 1.将除数b做左位移运算,找到不大于被除数的最大值max,根据位移n计算出当前放大倍数,即2^n。
* 2.用被除数a减去步骤1中最大值max,若余数大于除数b则回到步骤一。
* 3.累加步骤一所有倍数,得到商num。
*/
while (_a>=_b)
{
int index = 1;
while (_a>=_b<<index)
{
index++;
}
index--;
int p= Pow(2, index);
_a -= Multiply(_b, p);
num += p;
}
#endregion
return f ?num:~num+1;
}
/// <summary>
/// 幂
/// </summary>
/// <param name="_a"></param>
/// <param name="_b"></param>
/// <returns></returns>
static int Pow(int _a,int _b)
{
if (_b == 0)
{
return 1;
}
else if(_b == 1)
{
return _a;
}
else
{
_b--;
return Multiply(_a, Pow(_a,_b));
}
}