【问题标题】:What are the practical uses of modulus (%) in programming? [duplicate]模数 (%) 在编程中的实际用途是什么? [复制]
【发布时间】:2010-08-28 08:01:53
【问题描述】:

可能重复:
Recognizing when to use the mod operator

模数的实际用途是什么?我知道模除法是什么。我想到的第一个场景是用它来查找奇数和偶数以及时钟算术。但是我还能在哪里使用它呢?

【问题讨论】:

  • 应用程序太多。可能这应该是社区维基。
  • 您在需要时使用它。 “时钟算术”涵盖了所有用途,不是吗?

标签: operators modulo


【解决方案1】:

我发现最常见的用途是“环绕”您的数组索引。

例如,如果您只想重复循环遍历一个数组,您可以使用:

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

模确保i 保持在 [0, 10) 范围内。

【讨论】:

  • 我想不出这种无限循环有什么用处,但看起来很酷。
  • @Kau-Boy 一组图像可能会在网站标题上循环浏览,但随后声明if(i>count(array))i=1; 重新启动它就不那么简单了。然而,for 循环会很好地将所需的显示代码放在一个块中。
  • 很好的答案和用法。
【解决方案2】:

我通常在紧密的循环中使用它们,当我必须在每个 X 循环而不是每次迭代时都做一些事情时..

例子:

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

【讨论】:

  • 在某些实现中,这可能非常昂贵。
【解决方案3】:

要将数字打印为字符串,您需要模数才能找到数字的值。

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

【讨论】:

    【解决方案4】:

    模数运算的一个用途是在制作hash table 时。它用于将散列函数中的值转换为数组的索引。 (如果哈希表大小是 2 的幂,则可以使用位掩码进行取模,但它仍然是取模运算。)

    【讨论】:

    • 你能做一个代码示例吗?
    【解决方案5】:

    对于国际银行帐号的控制号,mod97 technique

    n 迭代之后也大批量做一些事情。这是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】:

      缓冲通信的通常实现使用循环缓冲区,您可以使用模数算法来管理它们。

      【讨论】:

        【解决方案7】:

        对于没有位运算符的语言,模数可用于获取数字的最低 n 位。例如,要获取 x 的最低 8 位:

        x % 256
        

        相当于:

        x & 255
        

        【讨论】:

        • 这个不够通用,只适用于 2^n。
        • 请务必注意,该公式仅适用于 x 的非负值。如果 x 为负数,x &amp; 255 将正确报告低位,而在大多数编译器(包括所有符合最新标准的编译器)中,x % 256 将产生垃圾。
        【解决方案8】:
        • 密码学。仅此一项就占模数的百分比(我夸大了,但你明白了)。

        也试试the Wikipedia page

        模算术在数论、群论、环论、结论、抽象代数、密码学、计算机科学、化学以及视觉和音乐艺术中被引用。

        根据我的经验,任何足够先进的算法都可能会涉及上述主题中的一个。

        【讨论】:

          【解决方案9】:

          嗯,你可以从很多角度来看待它。如果您将其视为数学运算,那么它只是一个模除法。即使我们不需要像 % 那样做任何事情,我们也可以使用减法来实现,但是每种编程语言都以非常优化的方式实现它。

          并且模除不限于求奇偶数或时钟算术。有数百种算法需要这个模块运算,例如密码学算法等。所以它和其他+、-、*、/等一样是一个通用的数学运算。

          除了数学的观点,不同的语言都使用这个符号来定义内置的数据结构,比如在 Perl 中%hash 用于表明程序员声明了一个哈希。所以这一切都因编程语言设计而异。

          所以仍然有很多其他的观点可以添加到 % 的使用列表中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-05-25
            • 2016-01-03
            • 2021-04-14
            • 2016-08-06
            • 1970-01-01
            • 2011-04-02
            • 2019-05-17
            相关资源
            最近更新 更多