mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-24 05:21:09 +00:00
56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
|
"""
|
||
|
Calculates the sum of two non-negative integers using bitwise operators
|
||
|
Wikipedia explanation: https://en.wikipedia.org/wiki/Binary_number
|
||
|
"""
|
||
|
|
||
|
|
||
|
def bitwise_addition_recursive(number: int, other_number: int) -> int:
|
||
|
"""
|
||
|
>>> bitwise_addition_recursive(4, 5)
|
||
|
9
|
||
|
>>> bitwise_addition_recursive(8, 9)
|
||
|
17
|
||
|
>>> bitwise_addition_recursive(0, 4)
|
||
|
4
|
||
|
>>> bitwise_addition_recursive(4.5, 9)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
TypeError: Both arguments MUST be integers!
|
||
|
>>> bitwise_addition_recursive('4', 9)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
TypeError: Both arguments MUST be integers!
|
||
|
>>> bitwise_addition_recursive('4.5', 9)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
TypeError: Both arguments MUST be integers!
|
||
|
>>> bitwise_addition_recursive(-1, 9)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: Both arguments MUST be non-negative!
|
||
|
>>> bitwise_addition_recursive(1, -9)
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: Both arguments MUST be non-negative!
|
||
|
"""
|
||
|
|
||
|
if not isinstance(number, int) or not isinstance(other_number, int):
|
||
|
raise TypeError("Both arguments MUST be integers!")
|
||
|
|
||
|
if number < 0 or other_number < 0:
|
||
|
raise ValueError("Both arguments MUST be non-negative!")
|
||
|
|
||
|
bitwise_sum = number ^ other_number
|
||
|
carry = number & other_number
|
||
|
|
||
|
if carry == 0:
|
||
|
return bitwise_sum
|
||
|
|
||
|
return bitwise_addition_recursive(bitwise_sum, carry << 1)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
import doctest
|
||
|
|
||
|
doctest.testmod()
|