Open In App

Check divisibility of binary string by 2^k

Improve
Improve
Like Article
Like
Save
Share
Report

Given a binary string and a number k, the task is to check whether the binary string is evenly divisible by 2k or not. 

Examples : 

Input : 11000  k = 2
Output : Yes
Explanation :
(11000)2 = (24)10
24 is evenly divisible by 2k i.e. 4.

Input : 10101 k = 3
Output : No
Explanation :
(10101)2 = (21)10
21 is not evenly divisible by 2k i.e. 8.

Naive Approach: Compute the binary string into decimal and then simply check whether it is divisible by 2k. But, this approach is not feasible for the long binary strings as time complexity will be high for computing decimal number from binary string and then dividing it by 2k.

Step-by-step approach:

  • Convert the binary string to decimal by iterating over each digit from left to right.
  • Calculate the value of 2^k using bitwise left shift operation (1 << k).
  • Check if the decimal value obtained in step 1 is divisible by the value obtained in step 2 using the modulus operator.
  • If the modulus is zero, return true, otherwise return false.

Below is the implementation of the above approach:

C++




#include <bits/stdc++.h>
using namespace std;
 
// function to check whether
// given binary number is
// evenly divisible by 2^k or not
bool isDivisible(char str[], int k)
{
    // convert binary string to decimal
    int decimal_num = 0;
    int base = 1;
    int n = strlen(str);
    for (int i = n - 1; i >= 0; i--) {
        if (str[i] == '1') {
            decimal_num += base;
        }
        base *= 2;
    }
 
    // check if decimal_num is divisible by 2^k
    return (decimal_num % (1 << k)) == 0;
}
 
// Driver program to test above
int main()
{
    // first example
    char str1[] = "10101100";
    int k = 2;
    if (isDivisible(str1, k))
        cout << "Yes" << endl;
    else
        cout << "No" << "\n";
 
    // Second example
    char str2[] = "111010100";
    k = 2;
    if (isDivisible(str2, k))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
 
    return 0;
}


Java




import java.util.Arrays;
 
public class Main {
 
    // function to check whether
    // given binary number is
    // evenly divisible by 2^k or not
    public static boolean isDivisible(String str, int k) {
        // convert binary string to decimal
        int decimal_num = 0;
        int base = 1;
        int n = str.length();
        for (int i = n - 1; i >= 0; i--) {
            if (str.charAt(i) == '1') {
                decimal_num += base;
            }
            base *= 2;
        }
 
        // check if decimal_num is divisible by 2^k
        return (decimal_num % (1 << k)) == 0;
    }
 
    // Driver program to test above
    public static void main(String[] args) {
        // first example
        String str1 = "10101100";
        int k = 2;
        if (isDivisible(str1, k))
            System.out.println("Yes");
        else
            System.out.println("No");
 
        // Second example
        String str2 = "111010100";
        k = 2;
        if (isDivisible(str2, k))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}


Python3




# function to check whether
# given binary number is
# evenly divisible by 2^k or not
def is_divisible(binary_str, k):
    # convert binary string to decimal
    decimal_num = 0
    base = 1
    n = len(binary_str)
    for i in range(n - 1, -1, -1):
        if binary_str[i] == '1':
            decimal_num += base
        base *= 2
 
    # check if decimal_num is divisible by 2^k
    return decimal_num % (1 << k) == 0
 
# Driver program to test above
if __name__ == "__main__":
    # first example
    str1 = "10101100"
    k = 2
    if is_divisible(str1, k):
        print("Yes")
    else:
        print("No")
 
    # Second example
    str2 = "111010100"
    k = 2
    if is_divisible(str2, k):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by shivamgupta0987654321


C#




using System;
 
class GFG
{
    // function to check whether
    // given binary number is
    // evenly divisible by 2^k or not
    static bool IsDivisible(string binaryStr, int k)
    {
        // convert binary string to decimal
        int decimalNum = 0;
        int baseValue = 1;
        int n = binaryStr.Length;
        for (int i = n - 1; i >= 0; i--)
        {
            if (binaryStr[i] == '1')
            {
                decimalNum += baseValue;
            }
            baseValue *= 2;
        }
 
        // check if decimalNum is divisible by 2^k
        return (decimalNum % (1 << k)) == 0;
    }
 
    // Driver program to test above
    static void Main()
    {
        // first example
        string str1 = "10101100";
        int k = 2;
        if (IsDivisible(str1, k))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
 
        // Second example
        string str2 = "111010100";
        k = 2;
        if (IsDivisible(str2, k))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}


Javascript




// Javascript code
 
// Function to check whether the given binary number is evenly divisible by 2^k or not
function isDivisible(binaryStr, k) {
    // Convert binary string to decimal
    let decimalNum = 0;
    let base = 1;
    for (let i = binaryStr.length - 1; i >= 0; i--) {
        if (binaryStr[i] === '1') {
            decimalNum += base;
        }
        base *= 2;
    }
 
    // Check if decimalNum is divisible by 2^k
    return decimalNum % (1 << k) === 0;
}
 
// Driver program to test above
const str1 = "10101100";
let k = 2;
if (isDivisible(str1, k)) {
    console.log("Yes");
} else {
    console.log("No");
}
 
const str2 = "111010100";
k = 2;
if (isDivisible(str2, k)) {
    console.log("Yes");
} else {
    console.log("No");
}
 
// This code is contributed by guptapratik


Output

Yes
Yes






Time Complexity:  O(n), where n is the length of the binary string.
Auxiliary Space: O(1), as we are not using any extra space.

Efficient Approach: In the binary string, check for the last k bits. If all the last k bits are 0, then the binary number is evenly divisible by 2k else it is not evenly divisible. Time complexity using this approach is O(k). 

Below is the implementation of the approach. 

C++




// C++ implementation to check whether
// given binary number is evenly
// divisible by 2^k or not
#include <bits/stdc++.h>
using namespace std;
 
// function to check whether
// given binary number is
// evenly divisible by 2^k or not
bool isDivisible(char str[], int k)
{
    int n = strlen(str);
    int c = 0;
     
    // count of number of 0 from last
    for (int i = 0; i < k; i++)   
        if (str[n - i - 1] == '0')        
            c++;
     
    // if count = k, number is evenly
    // divisible, so returns true else
    // false
    return (c == k);
}
 
// Driver program to test above
int main()
{
    // first example
    char str1[] = "10101100";
    int k = 2;
    if (isDivisible(str1, k))
        cout << "Yes" << endl;
    else
        cout << "No"
             << "\n";
 
    // Second example
    char str2[] = "111010100";
    k = 2;
    if (isDivisible(str2, k))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
 
    return 0;
}


Java




// Java implementation to check whether
// given binary number is evenly
// divisible by 2^k or not
class GFG {
     
    // function to check whether
    // given binary number is
    // evenly divisible by 2^k or not
    static boolean isDivisible(String str, int k)
    {
        int n = str.length();
        int c = 0;
     
        // count of number of 0 from last
        for (int i = 0; i < k; i++)
            if (str.charAt(n - i - 1) == '0')        
                c++;
     
        // if count = k, number is evenly
        // divisible, so returns true else
        // false
        return (c == k);
    }
 
    // Driver program to test above
    public static void main(String args[])
    {
         
        // first example
        String str1 = "10101100";
        int k = 2;
        if (isDivisible(str1, k) == true)
            System.out.println("Yes");
        else
            System.out.println("No");
 
    // Second example
        String str2 = "111010100";
        k = 2;
        if (isDivisible(str2, k) == true)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by JaideepPyne.


Python3




# Python 3 implementation to check
# whether given binary number is
# evenly divisible by 2^k or not
 
# function to check whether
# given binary number is
# evenly divisible by 2^k or not
def isDivisible(str, k):
    n = len(str)
    c = 0
     
    # count of number of 0 from last
    for i in range(0, k):
        if (str[n - i - 1] == '0'):    
            c += 1
     
    # if count = k, number is evenly
    # divisible, so returns true else
    # false
    return (c == k)
 
# Driver program to test above
# first example
str1 = "10101100"
k = 2
if (isDivisible(str1, k)):
    print("Yes")
else:
    print("No")
 
# Second example
str2 = "111010100"
k = 2
if (isDivisible(str2, k)):
    print("Yes")
else:
    print("No")
 
# This code is contributed by Smitha


C#




// C# implementation to check whether
// given binary number is evenly
// divisible by 2^k or not
using System;
 
class GFG {
     
    // function to check whether
    // given binary number is
    // evenly divisible by 2^k or not
    static bool isDivisible(String str, int k)
    {
        int n = str.Length;
        int c = 0;
     
        // count of number of 0 from last
        for (int i = 0; i < k; i++)
            if (str[n - i - 1] == '0')    
                c++;
     
        // if count = k, number is evenly
        // divisible, so returns true else
        // false
        return (c == k);
    }
 
    // Driver program to test above
    public static void Main()
    {
         
        // first example
        String str1 = "10101100";
        int k = 2;
         
        if (isDivisible(str1, k) == true)
            Console.Write("Yes\n");
        else
            Console.Write("No");
 
        // Second example
        String str2 = "111010100";
        k = 2;
         
        if (isDivisible(str2, k) == true)
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by Smitha.


Javascript




<script>
 
// Javascript implementation to check whether
// given binary number is evenly
// divisible by 2^k or not
 
// Function to check whether
// given binary number is
// evenly divisible by 2^k or not
function isDivisible(str, k)
{
    let n = str.length;
    let c = 0;
   
    // Count of number of 0 from last
    for(let i = 0; i < k; i++)
        if (str[n - i - 1] == '0')    
            c++;
   
    // If count = k, number is evenly
    // divisible, so returns true else
    // false
    return (c == k);
}
 
// Driver code
 
// First example
let str1 = "10101100";
let k = 2;
 
if (isDivisible(str1, k) == true)
    document.write("Yes" + "</br>");
else
    document.write("No");
 
// Second example
let str2 = "111010100";
k = 2;
 
if (isDivisible(str2, k) == true)
    document.write("Yes");
else
    document.write("No");
     
// This code is contributed by rameshtravel07
 
</script>


PHP




<?php
// PHP implementation to check whether
// given binary number is evenly
 
// function to check whether
// given binary number is
// evenly divisible by 2^k or not
function isDivisible($str, $k)
{
    $n = strlen($str);
    $c = 0;
     
    // count of number
    // of 0 from last
    for ($i = 0; $i < $k; $i++)
        if ($str[$n - $i - 1] == '0')    
            $c++;
     
    // if count = k,
    // number is evenly
    // divisible, so
    // returns true else
    // false
    return ($c == $k);
}
 
    // Driver Code
    // first example
    $str1 = "10101100";
    $k = 2;
    if (isDivisible($str1, $k))
        echo "Yes", "\n";
    else
        echo "No", "\n";
 
    // Second example
    $str2= "111010100";
    $k = 2;
    if (isDivisible($str2, $k))
        echo "Yes", "\n";
    else
        echo "No", "\n";
 
// This code is contributed by Ajit
?>


Output

Yes
Yes






Complexity Analysis:

  • Time Complexity: O(k)
  • Auxiliary Space: O(1)


Last Updated : 29 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads