跳转至

位运算实现加减乘除

参考文章 用基本位运算实现加减乘除

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);
        }


    }
}