一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天
位运算符实现加法
- 两个数作异或运算得sum;
- 两个数作与运算再左移一位得进位c;
- 判断c是否为0,若是,输出sum;如不是,sum与c继续进行3步操作。
public static int getSum(int x, int y){
int result;
int sum = x ^ y;
int carry = (x & y) << 1;
if(carry!=0){
result = getSum(sum, carry);
}else {
result = sum;
}
return result;
}
位运算符实现减法
减法对减数求补码使减法变为加法即可;
public static int getSub(int x, int y){
int result;
int sub = getSum(~y, 1);
result = getSum(x, sub);
return result;
}
位运算符实现乘法
先求乘数和被乘数的绝对值,然后对绝对值得乘数进行被乘数次加法操作,符号有乘数和被乘数异或判断,若小于0,对绝对值求和后的结果求补
public static int getMul(int x, int y){
int a = x<0 ? getSum(~x, 1) : x;
int b = y<0 ? getSum(~y, 1) : y;
int result = 0;
int count = 0;
while (count<a){
result = getSum(result, b);
count = getSum(count, 1);
}
if((x^y)<0){
result = getSum(~result, 1);
}
return result;
}
位运算符实现除法
不停的用被除数去减除数,直到被除数小于除数时,此时所减的次数就是我们需要的商,而此时的被除数就是余数。唯一需要注意的就是商的符号和余数的符号。商的符号确定方式也乘法是一样,即同号为正,异号为负。而余数的符号和被除数的符号是一样的。
public static int getDiv_shang(int x, int y){
int a = x<0 ? getSum(~x, 1) : x;
int b = y<0 ? getSum(~y, 1) : y;
int yushu = a;
int shang = 0;
while (yushu>=b){
yushu = getSub(yushu, b);
shang = getSum(shang, 1);
}
if((x^y)<0){
shang = getSum(~shang, 1);
}
return shang;
}
public static int getDiv_yushu(int x, int y){
int a = x<0 ? getSum(~x, 1) : x;
int b = y<0 ? getSum(~y, 1) : y;
int yushu = a;
int shang = 0;
while (yushu>=b){
yushu = getSub(yushu, b);
shang = getSum(shang, 1);
}
if(x<0){
yushu = getSum(~yushu, 1);
}
return yushu;
}