π‘ Problem Formulation: Detecting whether a given integer is a power of two is a common task in programming. In Python, there are several ways to achieve this. For instance, given the input number 8
, the output should be True
since 8 is 2 raised to the power of 3. Conversely, if the input is 5
, the output should be False
, as 5 is not a power of two.
Method 1: Using Logarithm and Modulo
This method calculates the base-2 logarithm of the number and checks if the result is an integer by comparing it to its integer cast. If the log value modulo 1 equals 0, then the number is a power of two.
Here’s an example:
import math def is_power_of_two(number): if number <= 0: return False log_value = math.log2(number) return log_value.is_integer() print(is_power_of_two(8)) print(is_power_of_two(5))
Output:
True False
The math.log2()
function finds the logarithm of the number with base 2, and is_integer()
checks if the resulting floating-point value is equivalent to an integer.
Method 2: Using Bitwise Operations
A number that is a power of two has exactly one bit set in its binary representation. This method checks for that property by using an ‘and’ bitwise operation.
Here’s an example:
def is_power_of_two(number): return number != 0 and (number & (number - 1)) == 0 print(is_power_of_two(8)) print(is_power_of_two(5))
Output:
True False
Here, (number & (number - 1))
will be zero only if there is a single bit set in number
, i.e., it is a power of two.
Method 3: Using Iteration and Division
By repeatedly dividing the number by two and checking if it eventually equals 1, we can determine if it’s a power of two. This method is straightforward but less efficient for large numbers.
Here’s an example:
def is_power_of_two(number): if number <= 0: return False while number % 2 == 0: number //= 2 return number == 1 print(is_power_of_two(8)) print(is_power_of_two(5))
Output:
True False
If the number is not a power of two, the loop will eventually set the number to a value other than one, concluding the check.
Method 4: Using Recursion
A recursive function divides the number by two and calls itself until either 1 or a non-even number is reached. It is a less preferred method due to its potential to reach stack overflow on larger numbers.
Here’s an example:
def is_power_of_two(number): if number == 1: return True elif number % 2 != 0 or number == 0: return False else: return is_power_of_two(number/2) print(is_power_of_two(8)) print(is_power_of_two(5))
Output:
True False
This function checks the divisibility by two and recurses until it finds a non-power of two or concludes the power of two property.
Bonus One-Liner Method 5: Using Set Comprehension
The set comprehension creates a set of powers of two within a range, and the function checks the membership of the given number in the set. It can be executed with a simple one-liner code.
Here’s an example:
is_power_of_two = lambda number: number in {2**x for x in range(number.bit_length() + 1)} print(is_power_of_two(8)) print(is_power_of_two(5))
Output:
True False
Python’s set comprehension constructs the set to which the number is compared, and bit_length()
is used to limit the necessary range size.
Summary/Discussion
- Method 1: Logarithm and Modulo. Precise and easy to understand. Can fail on very large numbers due to precision issues.
- Method 2: Bitwise Operations. Fast and efficient. Not as immediately intuitive as other methods.
- Method 3: Iteration and Division. Straightforward. Not very efficient for very large numbers.
- Method 4: Recursion. Elegant. Risky for large numbers because it can cause stack overflow.
- Bonus Method 5: Set Comprehension. Clever one-liner. Less performance-efficient due to creation of a set.