标签:return -- res long int add 全转 全位 加减乘除
文章目录
加法–实现乘除的基础
//位运算实现加法(两正数)
long long add(long long a,long long b){
if(!b)
return a;
//本位和进位左移一位相加,直到进位为0
return add(a^b,(a&b)<<1);
}//实现减法就不写了,减法只需要把其中一个数转负数的补码就行了
乘法(全转long long用于包括所有int数的乘法)
int mutiply(int a,int b){
int x = a>=0?a:~(a-1);
int y = b>=0?b:~(b-1);
int res = 0;
while(y){
if(y&1)
res = add(res,x);
//模拟手算过程
x <<= 1;
y >>= 1;
}//乘法结果为负数,则返回负数
return (a^b)<0?(~res)+1:res;
}
除法(需要处理的边界问题有点多,当然全转long long就没有这么多事了)
最重要的边界问题在于INT_MIN用补码对它进行操纵无法回到正数,得到的还是INT_MIN
//实现除法,从理论上也很简单,就是不断的减去除数看能减几次,但是每次只减一次效率太低!,所以用倍数
int div2(int a,int b){
if(a==0||b==0)
return 0;
//判断符号,一旦相异或后小于零说明两个符号位不同
bool sign = (a^b)<0;
//处理取正数的特殊情况,因为如果INT_MIN取正数计算会爆
if(b==INT_MIN)
return a==INT_MIN?1:0;
//用无符号型以便能正确的计算INT_MIN的情形
unsigned int x,y;
//同样处理a的特殊情况
if(a==INT_MIN){
if(b==1)
return INT_MIN;
if(b==-1)
return INT_MAX;
x = (unsigned int)a;
y = b>=0?b:~(b-1);
}else{
x = a>=0?a:~(a-1);
y = b>=0?b:~(b-1);}
if(x<y)
return 0;
int res = 0;
for (int i = 31; i >= 0; i--) {
//如果x/2^i大于y,则y*2^i小于x,所以可以直接加上2^i这个倍数,然后把x-y*倍数
//左移相当于除以2^i,右移相当于乘以2^i
if ((x >> i) >= y) {
res = add(res,1<<i);
x = add(x,~(y<<i)+1);
}
}//根据符号取得最后的结果,如果符号为负号就取反码得到负数
res = sign?(~res)+1:res;
return res;
}
标签:return,--,res,long,int,add,全转,全位,加减乘除 来源: https://blog.csdn.net/m0_50945504/article/details/117392785
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。