TheAlgorithms-Python
30 строк · 967.0 Байт
1def find_previous_power_of_two(number: int) -> int:
2"""
3Find the largest power of two that is less than or equal to a given integer.
4https://stackoverflow.com/questions/1322510
5
6>>> [find_previous_power_of_two(i) for i in range(18)]
7[0, 1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16]
8>>> find_previous_power_of_two(-5)
9Traceback (most recent call last):
10...
11ValueError: Input must be a non-negative integer
12>>> find_previous_power_of_two(10.5)
13Traceback (most recent call last):
14...
15ValueError: Input must be a non-negative integer
16"""
17if not isinstance(number, int) or number < 0:
18raise ValueError("Input must be a non-negative integer")
19if number == 0:
20return 0
21power = 1
22while power <= number:
23power <<= 1 # Equivalent to multiplying by 2
24return power >> 1 if number > 1 else 1
25
26
27if __name__ == "__main__":
28import doctest
29
30doctest.testmod()
31