讲解清晰 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
没有进位了,那之前加的就已经是正确答案了,2的3次方加2的2次方是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