这篇文章上次修改于 990 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
一、位运算
p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
二、位运算实现加法
int Add(int a, int b){
return b ? Add(a ^ b, (a & b) << 1) : a;
}
三、位运算实现减法
在进行位运算实现减法的过程中,首先应该注意到取反运算中的一个很重要的特点,即~b = -(b+1)。根据这个特点,我们可以很简单的利用位运算求得一个数的相反数,即利用Add(~b, 1)。而由于整数的减法实际上就是加法的逆运算,即a-b = a+(-b)。
int Minus(int a, int b){
return Add(a, Add(~b, 1));
}
四、位运算实现乘法
这里我们首先进行绝对值的运算,再通过a^b是否小于0判断符号的异同性。
int Multiply(int a, int b){
int a1 = a > 0 ? a : Add(~a, 1);
int b1 = b > 0 ? b : Add(~b, 1);
int sum = 0;
while(b1){
if(b1 & 0x1){
sum = Add(sum, a1);
}
a1 = a1 << 1;
b1 = b1 >> 1;
}
if((a ^ b) < 0)
return Add(~sum, 1);
else return sum;
}
五、位运算实现除法
跟加法、减法一样,除法是乘法的逆运算,那么除法就是做有限次的减法,直到被减数小于减数为止。这种思路类似于乘法中的简单思路,问题同样是在被除数远大于除数时,需要做多次除法。
改良的除法思路如下,考虑到int型整数占32位,那么用i = 31开始比较被除数与除数的2i的大小,若被除数大,则在商处直接加上i从而减小减法的次数。
int Divide(int a, int b){
int quotient = 0;
if(!b){
cout << "Error" << endl;
return 1;
}
for(int i = 31; i --; i > 0){
if((a >> i) >= b)
{
quotient = Add(quotient, 1 << i);
a = Minus(a, b << i);
}
}
if((a ^ b) < 0)
quotient = Add(~quotient, 1);
return quotient;
}
————————————————
参考原文链接:https://blog.csdn.net/qq_41716838/article/details/92193515
没有评论