【问题标题】:Bitwise modulo with numbers bigger 2³²数字更大的按位模 2³²
【发布时间】:2013-12-22 11:06:19
【问题描述】:

我必须计算 C 中两个大数的余数。一个大小为 938 或 256 位,另一个大小为 85 位。两者都不是 2^n 值!

我的基本想法是把每一位都作为一个短数组的一个元素,然后用基本的位运算来计算余数。但我不知道如何做到这一点。所以我希望这里有人可以帮助我。

对于那些感兴趣的人,我正在根据第 36 - 39 页的 UNISIG-SUBSET 036 http://www.era.europa.eu/Document-Register/Documents/Set-2-Index009-SUBSET-036%20v300.pdf 编写 ETCS - 编码器,并尝试计算校验位。

【问题讨论】:

  • 也许使用MPIR 会是另一种选择?
  • 有多个“长算术”库可用。您已经在 cmets 中建议使用 MPIR。我会提到 GMP(MPIR 确实是后者的分支,但您不太可能需要它的发明)。任何本土实施几乎都将做同样的事情,但效率较低。 OTOH 这些数字大小是在 Python 和 Erlang 中本地处理的,因此您可以在不附加额外库的情况下同时使用它们:)
  • 你知道什么是“长除法”吗?
  • 对每个位使用一个short 只是浪费空间和时间。有很多多精度数学库可用,例如 GMP,您可以使用它们

标签: c bit-manipulation division modulo


【解决方案1】:

假设您使用十进制,并且您想计算 X mod Y,您可以执行以下操作:

1. mod = 0;
2. mod = ((mod * 10) + mostCignificantDigit)%Y;
3. remove the mostCignificantDigit from your number, and return to 2.

换句话说,假设你有数字数组 A 中的数字:

mod = 0;
for (int index = 0; index < A.size(); ++index)
        mod = ((mod*10)+A[index]) %Y

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 2017-04-17
    • 2015-07-04
    • 1970-01-01
    • 2017-08-27
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多