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

≡放荡痞女 提交于 2019-12-18 10:17:14

问题


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?


回答1:


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.




回答2:


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;
}



回答3:


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);
}



回答4:


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.)




回答5:


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();



回答6:


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




回答7:


  • 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.




回答8:


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 %.




回答9:


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


来源:https://stackoverflow.com/questions/3589976/what-are-the-practical-uses-of-modulus-in-programming

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!