位运算实现整数的加减乘除

直接上代码吧

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

猜你喜欢

转载自blog.csdn.net/qq_42914882/article/details/110953992