![]() |
VOOZH | about |
Given a number n, find the highest power of 2 that divides n.
Examples:
Input : n = 48
Output : 16
Highest power of 2 that divides 48 is 16.
Input : n = 5
Output : 1
Highest power of 2 that divides 5 is 1.
A simple solution is to try all powers of 2 one by one starting from 1, then 2, then 4 and so on.
An efficient solution is based on bit magic. If we take a closer look, we can notice that, we basically need to find the number that has rightmost bit set at same position as n and all other bits as 0. For example, for n = 5 (101), our output is 001. For n = 48 (110000), our output is 010000
How do we find a number that has same rightmost set bit and all other bits as 0?
We follow below steps.
Let n = 48 (00110000)
Subtract one from n, i.e., we do n-1. We get 47(00101111)
Do negation of (n-1), i.e., we do ~(n-1). We get (11010000).
Do n & (~(n-1)), we get 00010000 which has value 16.
Below is the implementation of above approach:
16
Time Complexity: O(log2n)
Space Complexity:- O(1).
Approach - 2: This is also an efficient approach, where you can find the largest divisor of power two for a number 'n' using a predefined function in C for handling bits. Which is _builtin_ctz(n), this function helps you to find the trailing zeros of the number, and then you can see the bits-magic.
Input : n = 48 ~= (110000)2 // num of trailing zeros are = 4, so number of trailing zeros = 4
Output : 1<<4 =16 // pow(2,4) = 16 Highest power of 2 that divides 48 is 16.
Input : n = 21 ~= (10101)2 // no trailing zeros are present, so number of trailing zeros = 0
Output : 1<<0 =2 // pow(2,0)=1
Note: To know in the detail about such bits masking functions you can go through this article.
for 21 is 1 for 48 is 16
Time Complexity: O(log2n)
Space Complexity: O(1)