开发者

What are the practical uses of modulus (%) in programming? [duplicate]

开发者 https://www.devze.com 2023-01-13 05:29 出处:网络
This question already has answers here: Closed 12 years ago. Possible Duplicate: Recognizing when to use 开发者_如何转开发the mod operator
This question already has answers here: Closed 12 years ago.

Possible Duplicate:

Recognizing when to use 开发者_如何转开发the mod operator

What are the practical uses of modulus? I know what modulo division is. The first scenario which comes to my mind is to use it to find odd and even numbers, and clock arithmetic. But where else I could use it?


The most common use I've found is for "wrapping round" your array indices.

For example, if you just want to cycle through an array repeatedly, you could use:

int a[10];
for (int i = 0; true; i = (i + 1) % 10)
{
  // ... use a[i] ...
}

The modulo ensures that i stays in the [0, 10) range.


I usually use them in tight loops, when I have to do something every X loops as opposed to on every iteration..

Example:

int i;
for (i = 1; i <= 1000000; i++)
{
   do_something(i);
   if (i % 1000 == 0)
       printf("%d processed\n", i);
}


To print a number as string, you need the modulus to find the value of a digit.

string number_to_string(uint number) {
  string result = "";
  while (number != 0) {
    result = cast(char)((number % 10) + '0') ~ result;
    //                   ^^^^^^^^^^^
    number /= 10;
  }
  return result;
}


One use for the modulus operation is when making a hash table. It's used to convert the value out of the hash function into an index into the array. (If the hash table size is a power of two, the modulus could be done with a bit-mask, but it's still a modulus operation.)


For the control number of international bank account numbers, the mod97 technique.

Also in large batches to do something after n iterations. Here is an example for NHibernate:

ISession session = sessionFactory.openSession();
ITransaction tx = session.BeginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.Save(customer);
    if ( i % 20 == 0 ) { //20, same as the ADO batch size
        //Flush a batch of inserts and release memory:
        session.Flush();
        session.Clear();
    }
}

tx.Commit();
session.Close();


The usual implementation of buffered communications uses circular buffers, and you manage them with modulus arithmetic.


For languages that don't have bitwise operators, modulus can be used to get the lowest n bits of a number. For example, to get the lowest 8 bits of x:

x % 256

which is equivalent to:

x & 255


  • Cryptography. That alone would account for an obscene percentage of modulus (I exaggerate, but you get the point).

Try the Wikipedia page too:

Modular arithmetic is referenced in number theory, group theory, ring theory, knot theory, abstract algebra, cryptography, computer science, chemistry and the visual and musical arts.

In my experience, any sufficiently advanced algorithm is probably going to touch on one more of the above topics.


Well, there are many perspectives you can look at it. If you are looking at it as a mathematical operation then it's just a modulo division. Even we don't need this as whatever % do, we can achieve using subtraction as well, but every programming language implement it in very optimized way.

And modulu division is not limited to finding odd and even numbers or clock arithmetic. There are hundreds of algorithms which need this module operation, for example, cryptography algorithms, etc. So it's a general mathematical operation like other +, -, *, /, etc.

Except the mathematical perspective, different languages use this symbol for defining built-in data structures, like in Perl %hash is used to show that the programmer declared a hash. So it all varies based on the programing language design.

So still there are a lot of other perspectives which one can do add to the list of use of %.

0

精彩评论

暂无评论...
验证码 换一张
取 消