2022-09-16 17:14

java通过位运算符实现乘除运算

码自答

JavaEE

(859)

(0)

收藏

  • 乘法运算

    乘法运算的原理:

    在乘数为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

        image.png

        程序逻辑:

        遍历乘数中间所有的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条评论

点击登录参与评论