371. 两整数之和
1. 題目
不使用運算符?+?和?-????????,計算兩整數????????a?、b????????之和。
示例 1:
輸入: a = 1, b = 2 輸出: 3示例 2:
輸入: a = -2, b = 3 輸出: 12. 分析
在不采用加法和減法的前提下計算兩整數之和,這需要使用與運算符和異或運算符,首先,利用與運算 a & b,計算出 a 和 b 所有進位的位置,然后將其左移一位,這樣可以得到所有需要進位的值進位后最終的位置。然后利用異或運算 a ^ b,由于異或運算下相同位為0,不同位為1,所以可以獲取到 a + b 的不進位下的值。其次,如果是涉及到負數的加法,由于計算機運算都是采用補碼,正數的補碼為它本身,負數的補碼為其取反再加一,符號位不變,所以負數的加法在計算機底層實現的時候與正數的加法是一致的。
舉個例子,6 + 3,轉換成二進制就是 110 + 011,計算出需要進位的值 carry 為 (a & b) << 1 = 100, 不需要進位的值 nocarry 為 a ^ b = 101,首先需要判斷 carry 和 nocarry 之間相加的情況是否會產生進位,即求出 carry & nocarry 的值是否為 0, 不為 0 的話說明需要再次進位,100 & 101 = 100 不為 0,所以先保存 nocarry 的值到 tmp ,再重新計算 nocarry 的值 即 nocarry = carry ^ nocarry ,然后計算新的 carry 值? carry = tmp & carry,然后再對新的 carry 和 nocarry 進行之前的判斷,直到 carry 值為 0,這時返回nocarry即可。
3. 實現
class Solution { public:int getSum(int a, int b) {int sum = a ^ b;int carry = ((unsigned int)a & b) << 1;while(carry != 0){int tmp = carry;carry = ((unsigned int)sum & carry) << 1;sum ^= tmp;}return sum;} };?
轉載于:https://www.cnblogs.com/lawliet12/p/10800905.html
總結
以上是生活随笔為你收集整理的371. 两整数之和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven dependency中sco
- 下一篇: POJ_2104 K-th Number