【数据结构与算法】实现四则运算

来源:互联网 发布:sql 删除表 编辑:程序博客网 时间:2024/05/02 00:20

对数字的运算除了加减乘除外,也只有位操作了。
常见的位操作实现

  1. 常用的一个等式:-n = ~(n - 1) = ~n + 1
  2. 获取整数的二进制的最右边的1:n & (-n) 或 n & ~(n - 1)。例如 n = 010100, -n = 101100,那么n & (-n) = 000100
  3. 去除整数的二进制的最右边的1:n & (n - 1)。例如 n = 010100,n-1 = 010011,n&(n-1) = 010000

一、加法

模拟二制任加法,将加法的结果分为不进位的相加结果和相加产生的进位两部分。

    public static int add(int a,int b){        while(b!=0){            int noCarrayAdd=a^b;            b=(a&b)<<1;    //b是进位部分            a=noCarrayAdd; //a是不进位相加结果        }        return a;    }

二、减法

有符号整数在计算机内都是用补码存储的。
[x-y]补=[x]补-[y]补=[x]补+[-y]补
[-y]补=~[y]补+1

    public static int getNegative(int a){        return add(~a,1);    }    public static int sub(int a,int b){        return add(a,getNegative(b));    }

三、乘法

先看十进制数的乘法,考虑a与b相乘,b有n位。那么a*b=a*b[1]+(a*b[2])*10+(a*b[3])*10^2……+(a*b[n])*10^(n-1)=a*b[1]+(a*10)*b[2]+(a*10^2)*b[3]+……+(a*10^(n-1))*b[n]。
这个规律在二进制中同样适用,而且可以化简。因为b[i]只有0或1两种情况,当b[i]=0时,累加和不变,当b[i]=1时,加上a*2^(i-1)即可,而a*2^(i-1)在二进制中可以通过左移来实现。

    public static int multipy(int a,int b){        int sum=0;        while(b!=0){            if((b&1)==1){                sum=add(sum,a);            }            a=a<<1;            b=b>>>1;  //这里不能用循环右移>>,因为b有可能是负数        }        return sum;    }

四、除法

这个方法是从用位移实现整数除法看到的,暂时还没太看懂。

    public static int[] divide(int numerator, int denominator) {         boolean quotientFlag=true;        boolean modFlag=true;        if(numerator<0) {            numerator=getNegative(numerator);            quotientFlag=false;            modFlag=false;        }        if(denominator<0){            denominator=getNegative(denominator);            quotientFlag=!quotientFlag;        }        int mask = 0x1;         int quotient = 0;         while (denominator <= numerator) {             denominator <<= 1;             mask <<= 1;         }         while (mask > 1) {             denominator >>= 1;             mask >>= 1;             if (numerator >= denominator) {                 numerator = sub(numerator,denominator);                 quotient |= mask;             }         }         int[] result=new int[2];        result[0]=quotientFlag?quotient:getNegative(quotient);        result[1]=modFlag?numerator:getNegative(numerator);        return result;    }
0 0
原创粉丝点击