Check if a number is multiple of 9 using bitwise operators

Given a number n, write a function that returns true if n is divisible by 9, else false. The most simple way to check for n’s divisibility by 9 is to do n%9.
Another method is to sum the digits of n. If sum of digits is multiple of 9, then n is multiple of 9.
The above methods are not bitwise operators based methods and require use of % and /.
The bitwise operators are generally faster than modulo and division operators. Following is a bitwise operator based method to check divisibility by 9.

#include<iostream>
using namespace std;

// Bitwise operator based function to check divisibility by 9
bool isDivBy9(int n)
{
    // Base cases
    if (n == 0 || n == 9)
        return true;
    if (n < 9)
        return false;

    // If n is greater than 9, then recur for [floor(n/9) - n%8]
    return isDivBy9((int)(n>>3) - (int)(n&7));
}

// Driver program to test above function
int main()
{
    // Let us print all multiples of 9 from 0 to 100
    // using above method
    for (int i = 0; i < 100; i++)
       if (isDivBy9(i))
         cout << i << " ";
    return 0;
} 

Output:

0 9 18 27 36 45 54 63 72 81 90 99

How does this work?
n/9 can be written in terms of n/8 using the following simple formula.

n/9 = n/8 - n/72

Since we need to use bitwise operators, we get the value of floor(n/8) using n>>3 and get value of n%8 using n&7. We need to write above expression in terms of floor(n/8) and n%8.
n/8 is equal to “floor(n/8) + (n%8)/8″. Let us write the above expression in terms of floor(n/8) and n%8

n/9 = floor(n/8) + (n%8)/8 - [floor(n/8) + (n%8)/8]/9
n/9 = floor(n/8) - [floor(n/8) - 9(n%8)/8 + (n%8)/8]/9
n/9 = floor(n/8) - [floor(n/8) - n%8]/9

From above equation, n is a multiple of 9 only if the expression floor(n/8) – [floor(n/8) – n%8]/9 is an integer. This expression can only be an integer if the sub-expression [floor(n/8) – n%8]/9 is an integer. The subexpression can only be an integer if [floor(n/8) – n%8] is a multiple of 9. So the problem reduces to a smaller value which can be written in terms of bitwise operators.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above



Company Wise Coding Practice    Topic Wise Coding Practice





Writing code in comment? Please use code.geeksforgeeks.org, generate link and share the link here.

  • zaheeru

    Brilliant.. !! thanks.

  • Vrushali

    Hi All,

    There is one more solution to it.A number is divisble by 9 if the sum of its digits are multiple of 9

  • Lohith Ravi

    dude you are using subtration, i would rather subtract 9, until the original number gets less than 9

    isDivisbleby9(int n)
    {
    if(n==0) return true;
    else if(n < 9) return false;

    return isDivisbleby9(n-9);
    }

    • Bhagat Vishal

      dude you just used some extra stack . problem talks about bitwise operators . there may be multiple solutions to this approach , you need to find the solution using bitwise operators.

    • zaheeru

      the solution provided above reduces number of recursive calls, until number 72, the function gets executed once. so consider probability of recursive getting called.

  • inquisitive

    Are we expected to come up with this solution during an interview? Even if I do because i have read it, it’s quite apparent.

  • Mayank Rajani

    You are eventually using minus(-) which is not a bitwise operator.Not a very efficient one even if it is written iteratively. I would use n%9 instead. Pls correct me if I m wrong.

  • Mayank Rajani

    You are eventually using minus(-) which is not a bitwise operator.Not a very efficient one even if it is written iteratively. I would use n%9 instead. Pls correct me if I m wrong.

  • Abhishek Kumar

    gud one…!!!!

  • sachi059

    Nice idea

  • Koushik

    Good Solution……