26
26
27
27
<!-- 这里可写通用的实现逻辑 -->
28
28
29
- 两数字的二进制形式 a,b ,求和 s = a + b ,a(i)、b(i) 分别表示 a、b 的第 i 个二进制位。一共有 4 种情况:
29
+ ** 方法一:位运算 **
30
30
31
- | a(i) | b(i) | 不进位的和 | 进位 |
32
- | ---- | ---- | ---------- | ---- |
33
- | 0 | 0 | 0 | 0 |
34
- | 0 | 1 | 1 | 0 |
35
- | 1 | 0 | 1 | 0 |
36
- | 1 | 1 | 0 | 1 |
31
+ 两数字 ` a ` ,` b ` 求和。
32
+
33
+ 假设 $a_i$ 和 $b_i$ 分别表示 ` a ` 、` b ` 的第 $i$ 个二进制位。一共有 4 种情况:
34
+
35
+ | $a_i$ | $b_i$ | 不进位的和 | 进位 |
36
+ | ----- | ----- | ---------- | ---- |
37
+ | 0 | 0 | 0 | 0 |
38
+ | 0 | 1 | 1 | 0 |
39
+ | 1 | 0 | 1 | 0 |
40
+ | 1 | 1 | 0 | 1 |
37
41
38
42
观察可以发现,“不进位的和”与“异或运算”有相同规律,而进位则与“与”运算规律相同,并且需要左移一位。
39
43
40
- - 对两数进行按位 ` ^ ` 异或运算,得到不进位的和;
41
44
- 对两数进行按位 ` & ` 与运算,然后左移一位,得到进位;
45
+ - 对两数进行按位 ` ^ ` 异或运算,得到不进位的和;
42
46
- 问题转换为求:“不进位的数 + 进位” 之和;
43
47
- 循环,直至进位为 0,返回不进位的数即可(也可以用递归实现)。
44
48
48
52
49
53
<!-- 这里可写当前语言的特殊实现逻辑 -->
50
54
51
- 由于 python ` int ` 是无限长整型,左移不会自动溢出,因此需要特殊处理。
55
+ 由于 Python ` int ` 是无限长整型,左移不会自动溢出,因此需要特殊处理。
52
56
53
57
``` python
54
58
class Solution :
55
59
def add (self , a : int , b : int ) -> int :
56
60
a, b = a & 0x FFFFFFFF , b & 0x FFFFFFFF
57
61
while b:
58
- carry = ((a & b) << 1 ) & 0x FFFFFFFF
59
- a, b = a ^ b, carry
62
+ c = ((a & b) << 1 ) & 0x FFFFFFFF
63
+ a, b = a ^ b, c
60
64
return a if a < 0x 80000000 else ~ (a ^ 0x FFFFFFFF )
61
65
```
62
66
@@ -70,9 +74,9 @@ class Solution:
70
74
class Solution {
71
75
public int add (int a , int b ) {
72
76
while (b != 0 ) {
73
- int s = a ^ b ;
74
- b = (a & b) << 1 ;
75
- a = s ;
77
+ int c = (a & b) << 1 ;
78
+ a ^ = b ;
79
+ b = c ;
76
80
}
77
81
return a;
78
82
}
@@ -84,7 +88,9 @@ class Solution {
84
88
``` java
85
89
class Solution {
86
90
public int add (int a , int b ) {
87
- if (b == 0 ) return a;
91
+ if (b == 0 ) {
92
+ return a;
93
+ }
88
94
return add(a ^ b, (a & b) << 1 );
89
95
}
90
96
}
@@ -97,9 +103,9 @@ class Solution {
97
103
public:
98
104
int add(int a, int b) {
99
105
while (b) {
100
- unsigned int carry = (unsigned int)(a & b) << 1;
106
+ unsigned int c = (unsigned int)(a & b) << 1;
101
107
a = a ^ b;
102
- b = carry ;
108
+ b = c ;
103
109
}
104
110
return a;
105
111
}
@@ -115,7 +121,9 @@ public:
115
121
* @return {number}
116
122
*/
117
123
var add = function (a, b) {
118
- if (b == 0) return a;
124
+ if (b == 0) {
125
+ return a;
126
+ }
119
127
return add(a ^ b, (a & b) << 1);
120
128
};
121
129
```
@@ -147,6 +155,19 @@ public class Solution {
147
155
}
148
156
```
149
157
158
+ ### ** TypeScript**
159
+
160
+ ``` ts
161
+ function add(a : number , b : number ): number {
162
+ while (b ) {
163
+ const c = (a & b ) << 1 ;
164
+ a ^= b ;
165
+ b = c ;
166
+ }
167
+ return a ;
168
+ }
169
+ ```
170
+
150
171
### ** ...**
151
172
152
173
```
0 commit comments