forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsum_of_two_positive_numbers_bitwise.py
57 lines (47 loc) · 1.71 KB
/
sum_of_two_positive_numbers_bitwise.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""
Calculates the sum of two positive numbers using bitwise operator
Wikipedia explanation: https://en.wikipedia.org/wiki/Binary_number
"""
def sum_of_two_positive_numbers_bitwise(number: int, other_number: int) -> int:
""" "
>>> sum_of_two_positive_numbers_bitwise(4, 5)
9
>>> sum_of_two_positive_numbers_bitwise(8, 9)
17
>>> sum_of_two_positive_numbers_bitwise(0, 4)
4
>>> sum_of_two_positive_numbers_bitwise(4.5, 9)
Traceback (most recent call last):
...
TypeError: Both parameters MUST be in integer type!
>>> sum_of_two_positive_numbers_bitwise('4', 9)
Traceback (most recent call last):
...
TypeError: Both parameters MUST be in integer type!
>>> sum_of_two_positive_numbers_bitwise('4.5', 9)
Traceback (most recent call last):
...
TypeError: Both parameters MUST be in integer type!
>>> sum_of_two_positive_numbers_bitwise(-1, 9)
Traceback (most recent call last):
...
ValueError: Both parameters MUST be in positive value!
>>> sum_of_two_positive_numbers_bitwise(1, -9)
Traceback (most recent call last):
...
ValueError: Both parameters MUST be in positive value!
"""
if isinstance(number, int) is False or isinstance(other_number, int) is False:
raise TypeError("Both parameters MUST be in integer type!")
if number < 0 or other_number < 0:
raise ValueError("Both parameters MUST be in positive value!")
# Base case
sum = number ^ other_number
carry = number & other_number
if (carry) == 0:
return sum
# Recursive case
return sum_of_two_positive_numbers_bitwise(sum, carry << 1)
if __name__ == "__main__":
import doctest
doctest.testmod()