目录
一·简介:
本篇为两道例题带你用位操作符完成取代加号和除号运算符,满满干活,细细解答,通俗易懂,浑然通透版本。
二·例题讲解:
2.1不用加号的加法:
2.1.1题目:
leetcode 题目链接: . - 力扣(LeetCode)
2.1.2思路汇总:
思路:位操作符配合连用:首先用异或得到没有进位的得数,接着&配合<<得到要进的位,并对应在这个得数下面,后面直接再次异或即相当于进位了,然后这里就要里用循环+
重新赋值了,当再次进位可能会出现还要进位的情况,因此这选择了循环,直到不需要进位即结束,也就是这里对应得到进位的变量是0就可。
如14和5:1110,0101
2.1.3代码解答:
class Solution {
public:
int add(int a, int b) {
while(b!=0){
int ans1=(a^b);//得到未进位的加后的数
int ans2=(a&b)<<1;//得到要进的位左移相当于给它进位后,下面直接以后即再次未进位相加
a=ans1;//未进位的数
b=ans2;//对应进完位的位,后面直接异或
}
return a;
}
};
2.2两数相除:
2.2.1题目:
leetcode原题链接:. - 力扣(LeetCode)
2.2.2思路汇总:
思路:此题明显是让用位移符,这里要想到<< 有乘^n的作用,而>>有除2^n的作用,因此可以利用这点完成,这里的除法就是把dd转化成2^n(最大)乘一个大于或等于dr的数,那么
我们就可以知道它的余数肯定大于这个2^n,故可以先把这个余数的一部分加上,然后dd减去这部分余数乘dr,也就是求完余数的一部分,转化成另一个数对它得余数了,最后叠加就好
依次重复操作,最后得出即可,这里我们是倒序的因为要得到最大的这个2^n然后可以保证后面重复操作时候这个n一定小于上一次n。
细节问题:最大最小值处理以及正负号
一个式子解释如:17 /2: 2^4/2+1/2==8
2.2.3代码解答:
class Solution {
public:
int divide(int dividend, int divisor) {
int count=0;
if(dividend==0) return 0;
int flag=1;
if(dividend==INT_MIN&&divisor==-1) return INT_MAX;//这里如果不这么操作最后返回的是-INT_MIN,超出int限制
if(dividend==INT_MIN&&divisor==1) return INT_MIN;//这里如果没有,则后面直接abs INT_MIN,直接整型溢出了
if((dividend^divisor)<0) flag=-1;//判断最后的正负
long dd=abs(dividend);
long dr=abs(divisor);
for(int n=31;n>=0;n--){
if(dd>>n>=dr) {//得到最大的2^n
count+=1<<n;//叠加这个2^n
dd-=dr<<n;//下一次用去除得到部分余数的数再次循环,最会叠加count
}
}
return flag==1?count:-count;
}
};
以上就是刷题时所遇问题,解答汇总希望对您有助!