mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Is power of two (#7936)
* add is power of two * fix comment * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Deal with negative numbers * Spelling: negative Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
d23e709aea
commit
4e6c1c049d
57
bit_manipulation/is_power_of_two.py
Normal file
57
bit_manipulation/is_power_of_two.py
Normal file
|
@ -0,0 +1,57 @@
|
|||
"""
|
||||
Author : Alexander Pantyukhin
|
||||
Date : November 1, 2022
|
||||
|
||||
Task:
|
||||
Given a positive int number. Return True if this number is power of 2
|
||||
or False otherwise.
|
||||
|
||||
Implementation notes: Use bit manipulation.
|
||||
For example if the number is the power of two it's bits representation:
|
||||
n = 0..100..00
|
||||
n - 1 = 0..011..11
|
||||
|
||||
n & (n - 1) - no intersections = 0
|
||||
"""
|
||||
|
||||
|
||||
def is_power_of_two(number: int) -> bool:
|
||||
"""
|
||||
Return True if this number is power of 2 or False otherwise.
|
||||
|
||||
>>> is_power_of_two(0)
|
||||
True
|
||||
>>> is_power_of_two(1)
|
||||
True
|
||||
>>> is_power_of_two(2)
|
||||
True
|
||||
>>> is_power_of_two(4)
|
||||
True
|
||||
>>> is_power_of_two(6)
|
||||
False
|
||||
>>> is_power_of_two(8)
|
||||
True
|
||||
>>> is_power_of_two(17)
|
||||
False
|
||||
>>> is_power_of_two(-1)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: number must not be negative
|
||||
>>> is_power_of_two(1.2)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: unsupported operand type(s) for &: 'float' and 'float'
|
||||
|
||||
# Test all powers of 2 from 0 to 10,000
|
||||
>>> all(is_power_of_two(int(2 ** i)) for i in range(10000))
|
||||
True
|
||||
"""
|
||||
if number < 0:
|
||||
raise ValueError("number must not be negative")
|
||||
return number & (number - 1) == 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
Loading…
Reference in New Issue
Block a user