java用位运算实现加减乘除
前言我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号.
一、常见位运算
- &运算 &运算二进制每一位全1为1,否则为0
public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a & b);}12345在这里插入图片描述在这里插入图片描述
- |运算 |运算二进制每一位有1为1,全0为0
public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a | b);}12345在这里插入图片描述在这里插入图片描述
- ^运算 ^运算二进制每一位不同为1,相同为0
public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a ^ b);}12345在这里插入图片描述在这里插入图片描述
- ~运算 ~运算是二进制每一位按位取反.
public static void main(String[] args) {int a = 1;System.out.println(~a);}1234在这里插入图片描述在这里插入图片描述
二、位运算实现加法public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a + b);}12345在这里插入图片描述下来我们用位运算实现一下加法.在这里插入图片描述我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.在这里插入图片描述进行一次与运算,只有同时为1才为1,也当同时为1时,我们需要进位,所以我们进行与运算后进行左移一位的操作,即可得到进位后的数值.在这里插入图片描述我们对异或运算和与运算后左移一位的结果进行相加即可,但我们只能进行位运算,所以我们只能再次进行异或运算与与运算,直到云运算的结果为0时,我们的异或运算的结果即为加法的结果.
public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}
public static void main(String[] args) {
System.out.println(bitAdd(1,2));
}
12345678910111213在这里插入图片描述
三、位运算实现减法public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a - b);}12345在这里插入图片描述下来我们用位运算实现一下减法.在我们有了位运算实现加法的基础之后,我们的减法就变得简单了,a - b == a + ( -b ),所以我们只需要将b变为-b即可实现减法功能,但我们不能使用负号,那我们来用位运算来实现一下.在这里插入图片描述
public static void main(String[] args) {System.out.println(~3);}123在这里插入图片描述我们可以发现一个数取反与相反数差一,我们取反加一即可得到相反数.
public static void main(String[] args) {System.out.println(~3 + 1);}123在这里插入图片描述
public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}
public static int bitSub(int a,int b) {
return bitAdd(a,~b+1);
}
public static void main(String[] args) {
System.out.println(bitSub(1,3));
}
1234567891011121314151617在这里插入图片描述
四、位运算实现乘法public static void main(String[] args) {int a = 1;int b = 3;System.out.println(a * b);}12345在这里插入图片描述我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.在这里插入图片描述二进制中也是一样的,按位相乘,如果被乘数二进制位是1则与乘数相乘.每次运算进行移位在这里插入图片描述
public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}public static int bitMul(int a,int b) {int sum = 0;while(b != 0) {if((b & 1) != 0) {sum += a;}a <<= 1;b >>>= 1;}return sum;}
public static void main(String[] args) {
System.out.println(bitMul(1,3));
}
123456789101112131415161718192021222324在这里插入图片描述
四、位运算实现除法public static void main(String[] args) {int a = 7;int b = 2;System.out.println(a / b);}12345在这里插入图片描述我们在用位运算实现除法时,采用逆推的方式,a / b = c,a = c * b。
在这里插入图片描述我们只需要求出a减去b向左的移位,只要满足a <= b的移位即可,每次移动多少位即a / b的结果二进制中某一位为1,以此循环倒推即可.
在这里插入图片描述在这里插入图片描述
public static int bitAdd(int a,int b) {int sum = 0;while(b != 0) {sum = a ^ b;b = (a & b) << 1;a = sum;}return sum;}public static int negNum(int n) {//转化为相反数return bitAdd(~n,1);}public static int minus(int a,int b) {//实现两个数相减return bitAdd(a,negNum(b));}public static boolean isNeg(int n) {//判断是否为负数return n < 0;}public static int bitDiv(int a,int b) {int x = isNeg(a) ? negNum(a) : a;int y = isNeg(b) ? negNum(b) : b;int res = 0;for (int i = 30; i >= 0 ; i = minus(i,1)) {if((x >> i) >= y) {res |= (1 << i);x = minus(x,y << i);}}return isNeg(a) != isNeg(b) ? negNum(res) : res;
}
public static void main(String[] args) {
int a = 7;
int b = 2;
System.out.println(bitDiv(a,b));
}
12345678910111213141516171819202122232425262728293031323334353637383940在这里插入图片描述
我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号.
一、常见位运算
1. &运算
&运算二进制每一位全1为1,否则为0
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a & b);
}
12345


2. |运算
|运算二进制每一位有1为1,全0为0
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a | b);
}
12345


3. ^运算
^运算二进制每一位不同为1,相同为0
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a ^ b);
}
12345


4. ~运算
~运算是二进制每一位按位取反.
public static void main(String[] args) {
int a = 1;
System.out.println(~a);
}
1234


二、位运算实现加法
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a + b);
}
12345

下来我们用位运算实现一下加法.

我们进行一次异或运算就相当于进行一次无进位加法,那这样也不能实现加法,那我们得想办法,实现进位的数值.

进行一次与运算,只有同时为1才为1,也当同时为1时,我们需要进位,所以我们进行与运算后进行左移一位的操作,即可得到进位后的数值.

我们对异或运算和与运算后左移一位的结果进行相加即可,但我们只能进行位运算,所以我们只能再次进行异或运算与与运算,直到云运算的结果为0时,我们的异或运算的结果即为加法的结果.
public static int bitAdd(int a,int b) {
int sum = 0;
while(b != 0) {
sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return sum;
}
public static void main(String[] args) {
System.out.println(bitAdd(1,2));
}
12345678910111213

三、位运算实现减法
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a - b);
}
12345

下来我们用位运算实现一下减法.
在我们有了位运算实现加法的基础之后,我们的减法就变得简单了,a - b == a + ( -b ),所以我们只需要将b变为-b即可实现减法功能,但我们不能使用负号,那我们来用位运算来实现一下.

public static void main(String[] args) {
System.out.println(~3);
}
123

我们可以发现一个数取反与相反数差一,我们取反加一即可得到相反数.
public static void main(String[] args) {
System.out.println(~3 + 1);
}
123

public static int bitAdd(int a,int b) {
int sum = 0;
while(b != 0) {
sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return sum;
}
public static int bitSub(int a,int b) {
return bitAdd(a,~b+1);
}
public static void main(String[] args) {
System.out.println(bitSub(1,3));
}
1234567891011121314151617

四、位运算实现乘法
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a * b);
}
12345

我们小学的时候是怎么进行乘法的,按位相乘,每一位和每一位相乘.

二进制中也是一样的,按位相乘,如果被乘数二进制位是1则与乘数相乘.每次运算进行移位

public static int bitAdd(int a,int b) {
int sum = 0;
while(b != 0) {
sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return sum;
}
public static int bitMul(int a,int b) {
int sum = 0;
while(b != 0) {
if((b & 1) != 0) {
sum += a;
}
a <<= 1;
b >>>= 1;
}
return sum;
}
public static void main(String[] args) {
System.out.println(bitMul(1,3));
}
123456789101112131415161718192021222324

四、位运算实现除法
public static void main(String[] args) {
int a = 7;
int b = 2;
System.out.println(a / b);
}
12345

我们在用位运算实现除法时,采用逆推的方式,a / b = c,
a = c * b。

我们只需要求出a减去b向左的移位,只要满足a <= b的移位即可,每次移动多少位即a / b的结果二进制中某一位为1,以此循环倒推即可.


public static int bitAdd(int a,int b) {
int sum = 0;
while(b != 0) {
sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return sum;
}
public static int negNum(int n) {
//转化为相反数
return bitAdd(~n,1);
}
public static int minus(int a,int b) {
//实现两个数相减
return bitAdd(a,negNum(b));
}
public static boolean isNeg(int n) {
//判断是否为负数
return n < 0;
}
public static int bitDiv(int a,int b) {
int x = isNeg(a) ? negNum(a) : a;
int y = isNeg(b) ? negNum(b) : b;
int res = 0;
for (int i = 30; i >= 0 ; i = minus(i,1)) {
if((x >> i) >= y) {
res |= (1 << i);
x = minus(x,y << i);
}
}
return isNeg(a) != isNeg(b) ? negNum(res) : res;
}
public static void main(String[] args) {
int a = 7;
int b = 2;
System.out.println(bitDiv(a,b));
}
12345678910111213141516171819202122232425262728293031323334353637383940

查看10道真题和解析