乘法运算
乘法运算的原理:
在乘数为1的位置,都对应左移动到相同位置的被乘数,将这些左移后的被乘数相加,即可得相乘得结果.
乘数为0000 0101,从右往左数,第一位为1,对应的被乘数是0000 0011,第三位为1,被乘数向左移动2位,对应的数是0000 1100,计算0000 0011和0000 1100的和,就是相乘的结果。
3*5=0000 0011*0000 0101=0000 0011+0000 1100=3+12=15
程序逻辑:
遍历乘数中间所有的1,遇到乘数中间的1,总和+被乘数
x的值0000 0011
y的值0000 0101
y的最后一位为1,总和需要+0000 0011
y向右移一位 0000 0010,x向左移一位 0000 0110
y的最后一位为0,总和不加
y向右移一位 0000 0001,x向左移一位 0000 1100
y的最后一位为1,总和需要+0000 1100
依次类推
程序如下:
public class Mathematic { public int multiply(int x,int y) { if(y==0||x==0)//0乘以任何数 都是0 { return 0; } if(y>>1==0)//y得值就是1 任何数*1 就是数本身 { return x; } //if条件判断y得最后一位是不是1 条件为真 y得最后一位是1 if((y&1)!=0) //&优先级小于!= 所以(y&1)需要加() { int sum = this.multiply(x<<1, y>>1); return this.plus(x, sum); //被乘数+y中间其他为1的位置对应的被乘数相加的和 } else//y得最后一位不是1 { //不需要加被乘数 直接遍历判断y的下一位 return this.multiply(x<<1, y>>1); } } }
调用乘法方法:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Mathematic mathematic = new Mathematic(); int result = mathematic.multiply(3, 5); System.out.println(result); } }
除法运算
除法运算的原理:
乘法是通过找到乘数为1的位置,将被乘数左移到相同的位置,然后将所有移动后的被乘数相加。
所以除法相反,除数向左移位,移动的位数不确定,直到被除数减去左移后的除数的结果小于左移后的除数为止,除数左移的位数,相对应的位置
就是1,依次类推。
例如:
10*2
10-2>2,所以2向左移一位,2的二进制为0000 0010,2<<1得到的结果为0000 0100,就是4,10-4>4,所以2需要向左移动2位,0000 1000,
就是8,10-8<8。除数移动2位,所以对应的1向左移动2位,结果为0000 0100。
10-8结果为2,2-除数2的结果<除数2,所以除数不需要移位,结果为0000 0001。
两个结果|运算。0000 0101。
程序逻辑:
先找到除数左移的位数,将1左移相同的位数,1左移后的结果与剩下的被除数运算的结果进行|运算。
代码如下:
package com.wanmait; public class Mathematic { public int divide(int x,int y) { if(x<y) { return 0; } //查找y移动的位数 int i = 0; while(true) { int temp = y<<i;//y左移i位 int ms = this.minus(x,temp); if(ms<temp) { x = ms;//改变被除数x的值 break; } i++; } //i就是需要移动的位数 //i移动位数相应的位置是1 return 1<<i | this.divide(x, y); } }
调用除法运算:
package com.wanmait; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Mathematic mathematic = new Mathematic(); int result = mathematic.divide(10, 2); System.out.println(result); } }
0条评论
点击登录参与评论