讲解清晰 c++代码

不用加减乘除做加法

http://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215

48、不用加减乘除做加法

本质是在考位运算,因为除去那些也就只有位运算了

1)二进制的世界里先都考虑成二进制,比如5->101

7->111

(2)在正常的运算中是相加,然后进位,但是使用异或的时候都是不进位的加法(概念得知)

使用&则是获得进位的加法,因为由概念知,1&1时是1,1&0  0&1 0&0都是0,就可以用&来模拟那个进位。此时再左移,就相当于已经是进位完的“进位部分”了。

3)实战,101^111=010 (十进制2)

101&111=101---> 1010 (十进制9)

010+1010两部分再相加,因为还是有可能会进位,所以这个“相加”还是^& 来实现。前面那个0不影响结果的~

010^1010=1000

010&1010=010 ----> 0100,发现还是要进位对不对,那么继续加

1000^0100=1100

1000&0100=0000

没有进位了,那之前加的就已经是正确答案了,23次方加22次方是12

需要注意的就是经过上述推理需要是&>>1 不要忘记

C++代码:

class Solution {
    public:
        int Add(int num1,int num2) {
        int t1=-1,t2=-1;
        while(t2!=0){
            t1=num1^num2;//不进位
            t2=(num1&num2)<<1;//进位
            num1=t1;num2=t2;
        }
        return t1;
    }
};

代码要注意

(num1&num2)要加括号!!!因为有【优先极问题】

②上述代码t2=0为出界点,所以t2不能为0,初始化成别的

③左移1位,左边的符号<  一位是<<1 虽然意思的确是*2 但写还是得写<<1

全部评论

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务