|
23 | 23 |
|
24 | 24 | <!-- 这里可写通用的实现逻辑 -->
|
25 | 25 |
|
| 26 | +两数字的二进制形式 a,b ,求和 s = a + b ,a(i)、b(i) 分别表示 a、b 的第 i 个二进制位。一共有 4 种情况: |
| 27 | + |
| 28 | +| a(i) | b(i) | 不进位的和 | 进位 | |
| 29 | +| ---- | ---- | ---------- | ---- | |
| 30 | +| 0 | 0 | 0 | 0 | |
| 31 | +| 0 | 1 | 1 | 0 | |
| 32 | +| 1 | 0 | 1 | 0 | |
| 33 | +| 1 | 1 | 0 | 1 | |
| 34 | + |
| 35 | +观察可以发现,"不进位的和"与"异或运算"有相同规律,而进位则与"与"运算规律相同,并且需要左移一位。 |
| 36 | + |
| 37 | +- 对两数进行按位 `^` 异或运算,得到不进位的和; |
| 38 | +- 对两数进行按位 `&` 与运算,然后左移一位,得到进位; |
| 39 | +- 问题转换为求:"不进位的数 + 进位" 之和; |
| 40 | +- 循环,直至进位为 0,返回不进位的数即可(也可以用递归实现)。 |
| 41 | + |
26 | 42 | <!-- tabs:start -->
|
27 | 43 |
|
28 | 44 | ### **Python3**
|
29 | 45 |
|
30 | 46 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
31 | 47 |
|
32 | | -```python |
| 48 | +由于 python `int` 是无限长整型,左移不会自动溢出,因此需要特殊处理。 |
33 | 49 |
|
| 50 | +```python |
| 51 | +class Solution: |
| 52 | + def getSum(self, a: int, b: int) -> int: |
| 53 | + a, b = a & 0xffffffff, b & 0xffffffff |
| 54 | + while b: |
| 55 | + carry = ((a & b) << 1) & 0xffffffff |
| 56 | + a, b = a ^ b, carry |
| 57 | + return a if a < 0x80000000 else ~(a ^ 0xffffffff) |
34 | 58 | ```
|
35 | 59 |
|
36 | 60 | ### **Java**
|
37 | 61 |
|
38 | 62 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
39 | 63 |
|
40 | 64 | ```java
|
| 65 | +class Solution { |
| 66 | + public int getSum(int a, int b) { |
| 67 | + return b == 0 ? a : getSum(a ^ b, (a & b) << 1); |
| 68 | + } |
| 69 | +} |
| 70 | +``` |
| 71 | + |
| 72 | +### **C++** |
| 73 | + |
| 74 | +```cpp |
| 75 | +class Solution { |
| 76 | +public: |
| 77 | + int getSum(int a, int b) { |
| 78 | + while (b) |
| 79 | + { |
| 80 | + unsigned int carry = (unsigned int)(a & b) << 1; |
| 81 | + a = a ^ b; |
| 82 | + b = carry; |
| 83 | + } |
| 84 | + return a; |
| 85 | + } |
| 86 | +}; |
| 87 | +``` |
41 | 88 |
|
| 89 | +### **Go** |
| 90 | + |
| 91 | +```go |
| 92 | +func getSum(a int, b int) int { |
| 93 | + for b != 0 { |
| 94 | + s := a ^ b |
| 95 | + b = (a & b) << 1 |
| 96 | + a = s |
| 97 | + } |
| 98 | + return a |
| 99 | +} |
42 | 100 | ```
|
43 | 101 |
|
44 | 102 | ### **...**
|
|
0 commit comments