lc371位运算解法

运行时间0ms 超过100%
思路不复杂,就是分类讨论,从低位往高位计算,radix代表下一位计算结果往上进的位(以下称为r)
tmp1,tmp2表示a,b的最低位,key代表结果中对应位的取值,
一共有如下6种情况:
1.tmp1^tmp2=1,r=1
则key=0,r被更新为1
2.tmp1^tmp2=1,r=0
则key=1,r=0
3.tmp1=tmp2=1,r=1,
则key=1,r=1
4.tmp1=tmp2=1,r=0
则key=0,r=1
5.tmp1=tmp2=0,r=1
则key=1,r=0
6.tmp1=tmp2=0,r=0
则key=0,r=0

计算出每一位的key后 把它左移到对应位上,然后跟之前的结果或一下作为新的结果
这里cnt维护的是key所代表的位数
当ab最后都为0的时候,若cnt<31,这个时候可能还有进位没被计算,将radix左移cnt位并且与之前的结果或一下
若cnt=31,那么直接返回结果即可。

class Solution {
    public int getSum(int a, int b) {
        int radix=0,key=0,cnt=0,res=0;
        while(a!=0||b!=0){
            int tmp1=a&1,tmp2=b&1;
            if(tmp1==1&&tmp2==1){
                key=radix;
                radix=1;
            }else if(tmp1!=tmp2){
                key=radix^1;
            }
            else{
                key=radix;
                radix=0;
            }
            a>>>=1;b>>>=1;
            key<<=cnt;res=key|res;
            cnt++;

        }
        if(cnt==32) return res;
        radix<<=cnt;
        return res|radix;

    }
}

 

posted @ 2020-11-01 10:41  fjlruo  阅读(57)  评论(0编辑  收藏  举报