zoukankan      html  css  js  c++  java
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。

    1.整数加法

    int Add(int a,int b)  
    {  
        for(int i = 1; i; i <<= 1)       
            if(b & i)          
                for(int j = i; j; j <<= 1)      
                    if(a & j) a &= ~j;  
                    else {a |= j; break;}                        
        return a ;  
    }  
     

    我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
    在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
    下面还有一个网上的思路,我觉得这个更好:

    int Add(int a,int b)  
    {  
        if(b == 0) return a;//没有进位的时候完成运算  
        int sum,carry;  
        sum = a ^ b;//完成第一步没有进位的加法运算  
        carry=(a & b) << 1;//完成第二步进位并且左移运算  
        return Add(sum,carry);//进行递归,相加  
    }  

    我简化一下:

    int Add(int a,int b) { return b ?  Add(a ^ b,(a & b) <<1 ): a; } 

    上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。

    2.整数减法
    这个和加法一样了,首先取减数的补码,然后相加。

    1. int Minus(int a,int b)  
      {  
          for(int i = 1; i && ((b & i) ==0 ); i <<= 1)
              ;  
          for(int i <<= 1; i; i <<=1 ) 
              b ^= i;  
          return Add(a,b);  
      }  

    3.整数乘法

    乘法就是将乘数写成(2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。

     
    1. int Mul(int a,int b)  
      {  
          int ans = 0;  
          for(int i = 1; i; i <<= 1, a <<= 1)  
              if(b & i)  
                  ans += a;  
              return ans;  
      } 

    4.整数除法

    除法就是由乘法的过程逆推,依次减掉(如果够减的话)divisor << 31、divisor << 30、... 、divisor << 2、divisor << 1、divisor(要保证不能溢出)减掉相应数量的除数就在结果加上相应的数量。

      1. int Div(int dividend, int divisor) 
        {
            // assert(divisor != 0)
            int sign = 1;
            if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0)
                sign = -1;
            unsigned int x = (unsigned int)abs(dividend);
            unsigned int y = (unsigned int)abs(divisor);
            int bitCnt = sizeof(int) << 3;
            int quotient = 0;
            int k = bitCnt-1;
            while(((1 << k) & y) == 0) k--;
            for(int j = bitCnt-1-k; j >= 0; j--)
            {
                if(x >= (y << j))
                {
                    x -= (y << j);
                    quotient += (1 << j);
                }
            }
            return sign*quotient;
        }
  • 相关阅读:
    基于ASP.NET的comet简单实现
    常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
    关于Application.Lock和Lock(obj)
    asp.net 母版页使用详解--转
    ASP.NET 全局变量和页面间传值方法
    黑帽大会2014:10个酷炫的黑客工具
    python之高性能网络编程并发框架eventlet实例
    eCos中的线程与同步
    Ubuntu12.04 下修改Apache端口号
    PHP 之mysql空字符串问题
  • 原文地址:https://www.cnblogs.com/kimiway/p/3341622.html
Copyright © 2011-2022 走看看