Skip to content

Commit a552e11

Browse files
committed
add solution: sum-of-two-integers
1 parent 861567e commit a552e11

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
'''
2+
# ๋น„ํŠธ ์—ฐ์‚ฐ Bit Manipulation
3+
4+
## ์ด์ง„์ˆ˜ ๋ง์…ˆ binary addition
5+
6+
์ด์ง„์ˆ˜์—์„œ ๋‘ ๋น„ํŠธ๋ฅผ ๋”ํ•˜๊ธฐ
7+
8+
1. XOR: ์˜ฌ๋ฆผ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ํ•ฉ
9+
2. AND << 1: ์˜ฌ๋ฆผ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
10+
3. 1~2๋ฅผ carry๊ฐ€ 0์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
11+
12+
```
13+
while b:
14+
carry = (a & b) << 1 # ์˜ฌ๋ฆผ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
15+
a = (a ^ b) # ํ•ฉ
16+
b = carry # ์บ๋ฆฌ๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๋ฉด ๊ณ„์† ๊ณ„์‚ฐ
17+
```
18+
19+
## 32๋น„ํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ œ๊ฑฐ
20+
21+
- 0xFFFFFFFF๋Š” ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1์ž…๋‹ˆ๋‹ค.
22+
23+
Python์˜ int๋Š” ํฌ๊ธฐ ์ œํ•œ์ด ์—†์–ด์„œ ์—ฐ์‚ฐ ์ค‘ ๋น„ํŠธ ์ˆ˜๊ฐ€ ์ž๋™ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.
24+
MASK(0xFFFFFFFF)์™€ and ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด 32๋น„ํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
25+
26+
```
27+
MASK = 0xFFFFFFFF
28+
a = (a ^ b) & MASK # 32๋น„ํŠธ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์ดˆ๊ณผ ๋น„ํŠธ๊ฐ€ ์ œ๊ฑฐ๋จ
29+
b = carry & MASK
30+
```
31+
32+
## ์Œ์ˆ˜ ์ฒ˜๋ฆฌ
33+
34+
- 0x7FFFFFFF(2147483647) ์ดํ•˜๋Š” ์–‘์ˆ˜(Positive Number).
35+
- 0x80000000(2147483648) ์ด์ƒ์ด๋ฉด ์Œ์ˆ˜(Negative Number)
36+
37+
`a > MAX_INT(0x7FFFFFFF)`์ธ ๊ฒฝ์šฐ, 32๋น„ํŠธ ํ™˜๊ฒฝ์—์„œ ์Œ์ˆ˜ ๊ฐ’์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
38+
39+
```
40+
~(a ^ MASK) # 32๋น„ํŠธ ์Œ์ˆ˜ ๋ณ€ํ™˜
41+
```
42+
'''
43+
class Solution:
44+
def getSum(self, a: int, b: int) -> int:
45+
MASK = 0xFFFFFFFF
46+
MAX_INT = 0x7FFFFFFF
47+
48+
while b:
49+
carry = (a & b) << 1
50+
a = (a ^ b) & MASK
51+
b = carry & MASK
52+
53+
return a if a <= MAX_INT else ~(a ^ MASK) # a๊ฐ€ MAX_INT๋ณด๋‹ค ํฌ๋ฉด 32๋น„ํŠธ ํ™˜๊ฒฝ์—์„œ ์Œ์ˆ˜์ด๋ฏ€๋กœ ๋ณ€ํ™˜

0 commit comments

Comments
ย (0)