运行时间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; } }