In this blog post, I will teach you how to write C/C++ program to compute modulus division by a power-of-2-number without using the % (modulus operator). After reading this post you able to write an efficient program to compute modulus division by a power-of-2-number.
Let’s first understand the what the meaning of modulus it helps you to understand the code. Basically, modulus is the remainder of the euclidean division of one number by another. In C/C++ programming language % is called the modulo operator.
For example, 23 divided by 6 equals 3 but it remains 5. Here, 23 / 6 = 3 and 23 % 6 = 5.
Consider the below mentioned examples for more better understanding.
Input: 7 , 4 Output: 3 Explanation: As 7%4 = 3 Input: 27 2 Output: 1 Explanation: As 27%2 = 1 Input: 6 16 Output: 6 Explanation:As 6%16 = 6
Let’s see the problem statements for this question.
Problem Statement: Given two numbers “n” (dividend) and “d” (devisor), where d = 1U << s; (So d will be one of: 1, 2, 4, 8, 16, 32, …). Compute “n” modulo “d” without division (/) and modulo (%) operators, where “d” is a power of 2 number.
Disclaimer: Try to solve the problem yourself first otherwise it would be not worth solving this problem.
Using Bitwise AND with (d – 1):
The concept of (d-1) creates a binary number with all its bits set to 1, where d must be power of 2.
For an example d = 16,
Input : d = 16 Here's a simple ASCII representation of 8 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | (Example bit values) +---+---+---+---+---+---+---+---+
Now, (d - 1) equals 15,
Input : d = 15 Here's a simple ASCII representation of 8 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | (Example bit values) +---+---+---+---+---+---+---+---+
So, for getting n modulus d, you just need to return n & (d-1)
C program to compute modulus division by a power-of-2-number:
/*
C program to get position
of only set Bit:
*/
#include <stdio.h>
#include<stdint.h>
//C Function to check if num is power of 2
uint32_t isPowerOfTwo(uint32_t num)
{
/* Zero and negative numbers
are not powers of two*/
uint32_t ret = (num > 0)?
((num != 0)&&((num & (num-1)) == 0)):0;
return ret ;
}
// This function will return n % d.
// d must be one of: 1, 2, 4, 8, 16, 32, …
int64_t getModulo(uint32_t n,
uint32_t d)
{
int64_t ret = -1;
//check divisor
if(isPowerOfTwo(d))
{
ret = (n&(d - 1));
}
return ret;
}
int main()
{
uint32_t n = 27;
uint32_t d = 8;
const int64_t modulos = getModulo(n,d);
if(modulos >= 0)
{
printf("%u modulo %u is %u\n", n, d, (uint32_t)modulos);
}
else
{
printf("Invalid divisor\n");
}
return 0;
}
Output:
27 modulo 8 is 3
C++ program to compute modulus division by a power-of-2-number:
/*
C++ program to get position
of only set Bit:
*/
#include <iostream>
#include<stdint.h>
//C++ Function to check if num is power of 2
bool isPowerOfTwo(uint32_t num)
{
/* Zero and negative numbers
are not powers of two*/
const bool ret = (num > 0)?
((num != 0)&&((num & (num-1)) == 0)):false;
return ret ;
}
// This function will return n % d.
// d must be one of: 1, 2, 4, 8, 16, 32, …
int64_t getModulo(uint32_t n,
uint32_t d)
{
int64_t ret = -1;
//check divisor
if(isPowerOfTwo(d))
{
ret = static_cast<int64_t>(n&(d - 1));
}
return ret;
}
int main()
{
uint32_t n = 27;
uint32_t d = 8;
const int64_t modulos = getModulo(n,d);
if(modulos >= 0)
{
std::cout<< n << " modulo " << d << " is ";
std::cout<<static_cast<uint32_t>(modulos)<<std::endl;
}
else
{
std::cout<<"Invalid divisor"<<std::endl;
}
return 0;
}
Output:
27 modulo 8 is 3
Recommended Post
- Turn off the rightmost set bit.
- Count Set bits in an Integer.
- Count Set bits in an Integer using the lookup table.
- Rotate bits of a number.
- How to set, clear or toggle a single bit in C/C++?
- Macros for Bit Manipulation in C/C++.
- 5 Ways to Check if Two Integers have Opposite Signs.
- C Program to Find whether a given integer is a power of three or not.
- Operator Precedence And Associativity In C.
- Operators in C language