Highest power of two that divides a given number
Last Updated :
19 Oct, 2023
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:
C++
// CPP program to find highest power
// of 2 that divides n.
#include<iostream>
using namespace std;
int highestPowerOf2(int n)
{
return (n & (~(n - 1)));
}
int main()
{
int n = 48;
cout << highestPowerOf2(n);
return 0;
}
Java
// Java program to find highest power
// of 2 that divides n.
class GFG
{
static int highestPowerOf2(int n)
{
return (n & (~(n - 1)));
}
public static void main(String []args)
{
int n = 48;
System.out.println(highestPowerOf2(n));
}
}
Python3
# Python3 program to find highest power
# of 2 that divides n.
def highestPowerOf2(n):
return (n & (~(n - 1)))
#Driver code
if __name__=='__main__':
n = 48
print(highestPowerOf2(n))
# this code is contributed
# by ash264
C#
// C# program to find highest power
// of 2 that divides n.
using System;
class GFG
{
static int highestPowerOf2(int n)
{
return (n & (~(n - 1)));
}
public static void Main()
{
int n = 48;
Console.Write(highestPowerOf2(n));
}
}
// This code is contributed
// by Akanksha Rai(Abby_akku)
JavaScript
<script>
// javascript program to find highest power
// of 2 that divides n.
function highestPowerOf2(n)
{
return (n & (~(n - 1)));
}
var n = 48;
document.write(highestPowerOf2(n));
// This code is contributed by 29AjayKumar
</script>
PHP
<?php
// PHP program to find highest power
// of 2 that divides n.
function highestPowerOf2($n)
{
return ($n & (~($n - 1)));
}
// Driver Code
$n = 48;
echo highestPowerOf2($n);
// This code is contributed
// by Sach_Code..
?>
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.
C++
#include <iostream>
using namespace std;
int main()
{
int n = 21;
int m = 48;
cout << "for " << n << " is " << (1 << __builtin_ctz(n))
<< endl;
cout << "for " << m << " is " << (1 << __builtin_ctz(m))
<< endl;
return 0;
}
// This code is contributed by Prajwal Kandekar
C
#include <stdio.h>
int main()
{
int n = 21;
int m = 48;
printf("for %d is %d ", n, (1 << __builtin_ctz(n)));
printf("\nfor %d is %d ", m, (1 << __builtin_ctz(m)));
return 0;
}
Java
public class Main {
public static void main(String[] args)
{
int n = 21;
int m = 48;
System.out.println(
"for " + n + " is "
+ (1 << Integer.numberOfTrailingZeros(n)));
System.out.println(
"for " + m + " is "
+ (1 << Integer.numberOfTrailingZeros(m)));
}
}
Python3
n = 21
m = 48
print(f"for {n} is {1 << (n & -n).bit_length() - 1}")
print(f"for {m} is {1 << (m & -m).bit_length() - 1}")
C#
using System;
class Program {
// Function to find the position of the least
// significant set bit
static int FindLeastSignificantBitPosition(int num)
{
int position = 0;
while ((num & 1) == 0) {
num >>= 1;
position++;
}
return position;
}
static void Main()
{
int n = 21;
int m = 48;
int positionN = FindLeastSignificantBitPosition(n);
int positionM = FindLeastSignificantBitPosition(m);
Console.WriteLine("for " + n + " is "
+ (1 << positionN));
Console.WriteLine("for " + m + " is "
+ (1 << positionM));
}
}
JavaScript
// JavaScript code for above approach
// Taken n
let n = 21;
// Taken m
let m = 48;
// Printing answer
console.log(`for ${n} is ${1 << (n & -n).toString(2).length - 1}`);
console.log(`for ${m} is ${1 << (m & -m).toString(2).length - 1}`);
Outputfor 21 is 1
for 48 is 16
Time Complexity: O(log2n)
Space Complexity: O(1)
Similar Reads
Highest power of a number that divides other number Given two numbers N and M, the task is to find the highest power of M that divides N. Note: M > 1 Examples: Input: N = 48, M = 4 Output: 2 48 % (4^2) = 0 Input: N = 32, M = 20 Output: 0 32 % (20^0) = 0 Brute Force Approach: The idea to solve this problem is to iterate from 1 to m and for each num
15+ min read
Highest power of a number that divides other number | Set - 2 Given two numbers N and M(M > 1), the task is to find the highest power of M that divides N. Examples: Input: N = 12, M = 2Output: 2Explanation: The powers of 2 which divide 12 are 1 and 2 (21 = 2 and 22 = 4 which both divide 12). The higher power is 2, hence consider 2. Input: N = 500, M = 5Outp
5 min read
Largest number that divides x and is co-prime with y Given two positive numbers x and y. Find the maximum valued integer a such that: a divides x i.e. x % a = 0a and y are co-prime i.e. gcd(a, y) = 1 Examples : Input : x = 15 y = 3 Output : a = 5 Explanation: 5 is the max integer which satisfies both the conditions. 15 % 5 =0 gcd(5, 3) = 1 Hence, outp
6 min read
Partition a number into two divisible parts Given a number (as string) and two integers a and b, divide the string in two non-empty parts such that the first part is divisible by a and the second part is divisible by b. If the string can not be divided into two non-empty parts, output "NO", else print "YES" with the two parts. Examples: Input
15+ min read
Largest number with the given set of N digits that is divisible by 2, 3 and 5 Given a set of 'N' digits. The task is to find the maximum integer that we can make from these digits. The resultant number must be divisible by 2, 3, and 5. Note: It is not necessary to use all the digits from the set. Also, leading zeroes are not allowed.Examples: Input: N = 11, setOfDigits = {3,
15+ min read
Largest number smaller than or equal to N divisible by K Given a number N and a number K, the task is to find the largest number smaller than or equal to N which is divisible by K. Examples: Input: N = 45, K = 6 Output: 42 42 is the largest number smaller than or equal to 45 which is divisible by 6.Input: N = 11, K = 3 Output: 9 Approach: The idea is to d
4 min read