File tree Expand file tree Collapse file tree 2 files changed +2
-92
lines changed Expand file tree Collapse file tree 2 files changed +2
-92
lines changed Original file line number Diff line number Diff line change 22
33## 题解
44
5-
6-
75题目要求不能使用 $+、-$,自然想到使用其他的二元运算符,我们可以根据二进制位,选择位运算符计算得到两数之和。
86
97** 二进制相加,思想类似于十进制加法,但从「逢十进一」变为 「逢二进一」。**
18160 + 1 = 1
1917
20180 + 0 = 0
21-
2219```
2320
24-
25-
2621直接使用异或 ^ 运算符的话,需要额外处理进位的情况, 即两个二进制位都为1。
2722
2823我们可以使用 bit位为进位符,来判断这种情况。
3631```
3732bit = 0 的情况
3833
39-
40-
4134二进制位相加 运算后结果
4235
43-
44-
45361 + 1 = 0 (进位) --> 答案加 0 bit=1
46-
47371 + 0 = 1 --> 答案加 2^i bit=0
48-
49380 + 1 = 1 --> 答案加 2^i bit=0
50-
51390 + 0 = 0 --> 答案加 2^i bit=0
52-
5340```
5441
5542
5643
5744```
5845bit = 1 的情况
5946
60-
61-
6247二进制位相加 运算后结果
6348
64-
65-
66491 + 1 = 0 (进位) --> 答案加 2^i bit=1
67-
68501 + 0 = 1 --> 答案加 0 bit=1
69-
70510 + 1 = 1 --> 答案加 0 bit=1
71-
72520 + 0 = 0 --> 答案加 2^i bit=0
73-
7453```
7554
7655数据范围是 $-1000<=x<=1000$,如果没有负数,根据二进制位,我们只需要统计10个二进制位,因为 $2^{10}=1024>100$。
@@ -87,50 +66,29 @@ bit = 1 的情况
8766
8867``` c++
8968class Solution {
90-
9169public:
92-
9370 int getSum(int a, int b) {
94-
9571 int ans = 0, bit = 0;
96-
9772 for (int i = 0; i < 32; i++) {
98-
9973 int x = (a >> i) & 1, y = (b >> i) & 1;
100-
10174 if (x & y) {
102-
10375 ans |= (bit << i);
104-
10576 bit = 1;
106-
10777 } else if (x | y) {
108-
10978 ans |= (1 ^ bit) << i;
110-
11179 } else {
112-
11380 ans |= (bit << i);
114-
11581 bit = 0;
116-
11782 }
118-
11983 }
120-
12184 return ans;
122-
12385 }
124-
12586};
126-
12787```
12888
12989
13090## 最后
13191
132-
133-
13492大家好,我是编程熊,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,欢迎 [关注我](https://leetcode-cn.com/u/bianchengxiong/) 和加入 [LeetCode组队刷题群](https://mp.weixin.qq.com/s/TsTcCDboXwnTnUeIW3Zg9Q)。
13593
13694
@@ -149,5 +107,4 @@ public:
149107
150108
151109
152- 如果题解和文章对你有所帮助,欢迎** 点赞** 支持。
153-
110+ 如果题解和文章对你有所帮助,欢迎**点赞**支持。
Original file line number Diff line number Diff line change 22
33## 题解
44
5-
6-
75题目要求不能使用 $+、-$,自然想到使用其他的二元运算符,我们可以根据二进制位,选择位运算符计算得到两数之和。
86
97** 二进制相加,思想类似于十进制加法,但从「逢十进一」变为 「逢二进一」。**
108
119** 两个二进制位相加有以下四种情况。**
1210
1311```
14-
15121 + 1 = 0 (进位)
1613
17141 + 0 = 1
1815
19160 + 1 = 1
2017
21180 + 0 = 0
22-
2319```
2420
25-
26-
2721直接使用异或 ^ 运算符的话,需要额外处理进位的情况, 即两个二进制位都为1。
2822
2923我们可以使用 bit位为进位符,来判断这种情况。
3529** 假设现在统计到二进制的第 i 位。**
3630
3731```
38-
3932bit = 0 的情况
4033
41-
42-
4334二进制位相加 运算后结果
4435
45-
46-
47361 + 1 = 0 (进位) --> 答案加 0 bit=1
48-
49371 + 0 = 1 --> 答案加 2^i bit=0
50-
51380 + 1 = 1 --> 答案加 2^i bit=0
52-
53390 + 0 = 0 --> 答案加 2^i bit=0
54-
5540```
5641
5742
5843
5944```
60-
6145bit = 1 的情况
6246
63-
64-
6547二进制位相加 运算后结果
6648
67-
68-
69491 + 1 = 0 (进位) --> 答案加 2^i bit=1
70-
71501 + 0 = 1 --> 答案加 0 bit=1
72-
73510 + 1 = 1 --> 答案加 0 bit=1
74-
75520 + 0 = 0 --> 答案加 2^i bit=0
76-
7753```
7854
7955数据范围是 $-1000<=x<=1000$,如果没有负数,根据二进制位,我们只需要统计10个二进制位,因为 $2^{10}=1024>100$。
@@ -89,52 +65,30 @@ bit = 1 的情况
8965
9066
9167``` c++
92-
9368class Solution {
94-
9569public:
96-
9770 int getSum(int a, int b) {
98-
9971 int ans = 0, bit = 0;
100-
10172 for (int i = 0; i < 32; i++) {
102-
10373 int x = (a >> i) & 1, y = (b >> i) & 1;
104-
10574 if (x & y) {
106-
10775 ans |= (bit << i);
108-
10976 bit = 1;
110-
11177 } else if (x | y) {
112-
11378 ans |= (1 ^ bit) << i;
114-
11579 } else {
116-
11780 ans |= (bit << i);
118-
11981 bit = 0;
120-
12182 }
122-
12383 }
124-
12584 return ans;
126-
12785 }
128-
12986};
130-
13187```
13288
13389
13490## 最后
13591
136-
137-
13892大家好,我是编程熊,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,欢迎 [关注我](https://leetcode-cn.com/u/bianchengxiong/) 和加入 [LeetCode组队刷题群](https://mp.weixin.qq.com/s/TsTcCDboXwnTnUeIW3Zg9Q)。
13993
14094
@@ -153,5 +107,4 @@ public:
153107
154108
155109
156- 如果题解和文章对你有所帮助,欢迎** 点赞** 支持。
157-
110+ 如果题解和文章对你有所帮助,欢迎**点赞**支持。
You can’t perform that action at this time.
0 commit comments