特殊的加法和除法(考察点为位操作符)

目录

一·简介:

二·例题讲解:

2.1不用加号的加法:

2.1.1题目:

2.1.2思路汇总:

2.1.3代码解答:

2.2两数相除:

2.2.1题目:

2.2.2思路汇总:

2.2.3代码解答:


一·简介:

本篇为两道例题带你用位操作符完成取代加号和除号运算符,满满干活,细细解答,通俗易懂,浑然通透版本。

二·例题讲解:

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;
    }
};

以上就是刷题时所遇问题,解答汇总希望对您有助! 

评论 85
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羑悻的小杀马特.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值