参考文章
用基本位运算实现加减乘除
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BseOperate
{
class Program
{
//加减乘除运算
static void Main(string[] args)
{
Console.WriteLine("1+3 = "+Add(1, 3)) ;
Console.WriteLine("1+(-3) = " + Add(1, -3));
Console.WriteLine("1-3 = " + Subtraction(1, 3));
Console.WriteLine("1-(-3) = " + Subtraction(1, -3));
Console.WriteLine("5*3 = " + Multiply(5, 3));
Console.WriteLine("-5*3 = " + Multiply(-5, 3));
Console.WriteLine("19/3 = " + Divide(19, 3));
Console.WriteLine("-19/3 = " + Divide(-19, 3));
}
/// <summary>
/// 加法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int Add(int a,int b)
{
int tmp = 0;
while(b!=0)
{
tmp = a ^ b; //不带进位的加法
b = (a & b) << 1; //只带进位的加法
a = tmp;
}
return a;
}
/// <summary>
/// 减法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int Subtraction(int a, int b)
{
return Add(a, negtive(b));
}
/// <summary>
/// 乘法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int Multiply(int a, int b)
{
int mark = a ^ b;
//对被除数和除数取绝对值
a = a < 0 ? Add(~a, 1) : a;
b = b < 0 ? Add(~b, 1) : b;
int res = 0;
while (b != 0)
{
if ((b & 1) != 0)
res = Add(res, a);
a = a << 1;
b = b >> 1;
}
if (mark < 0)
{
res = negtive(res);
}
return res;
}
/// <summary>
/// 除法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int Divide(int a,int b)
{
int mark = a ^ b;
//对被除数和除数取绝对值
a = a < 0 ? Add(~a, 1) : a;
b = b < 0 ? Add(~b, 1) : b;
int res = 0;
while(a>=b)
{
a = Subtraction(a, b);
res = Add(res, 1);
}
if(mark<0)
{
res = negtive(res);
}
return res;
}
/// <summary>
/// 增加负号
/// 取反加一
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
static int negtive(int a)
{
return Add(~a, 1);
}
}
}