将 bignum 解析为 16 位整数列表

发布于 2024-08-17 03:12:31 字数 269 浏览 4 评论 0原文

我必须实现一些大数算术。该数字必须拆分为 16 位整数列表。

这不是问题所在。问题是将字符串解析为这种表示法。如果它是单个整数,我将向后遍历字符串,从字符中取出数字并添加*10^stringposition。 (本例中最后一个字符的字符串位置为 1)

但是 bignum 不应该有乘法,我认为应该有一种更智能、更快的方法。 (int 乘法是 O(1);bignum 乘法不是)

怎么做?

(我不能使用像gmp这样的完整库)

I have to implement some bignum arithmetics. The number has to be split into a list of 16 bit integers.

That is not the problem. The problem is to parse a string into this notation. If it would be a single integer, i would go through the string backwards, get the number out of the char and would add <number>*10^stringposition. (last char has stringposition 1 in this example)

But the bignum should not have multiplication and I thing there should be a smarter faster way. (A int multiplication is O(1); a bignum multiplication not)

How to do it?

(I can not use a complete library like gmp)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空城之時有危險 2024-08-24 03:12:31

在 Java 中,您可以使用 java.math.BigInteger 类来解决问题。

  1. 从字符串输入创建一个 BigInteger:

    BigInteger x = new BigInteger(s);

  2. 获取包含此 BigInteger 的补码表示形式的字节数组:

    byte[] b = x.toByteArray();

  3. 将字节数组转换为 int[],将连续的 8 位值对合并为 16 位值,如下所示:

    <块引用>

    int[] merge(byte[] b) {
        int[] 结果 = new int[((b.length-1)>>1) + 1];
        for (int i = 0; i < b.length; i++) {
             结果[i>>1] |= b[b.length-i-1] << ((i&1)<<3);
        }
        返回结果;
    }
    

In Java you can solve your problem using java.math.BigInteger class.

  1. Create a BigInteger from your String input:

    BigInteger x = new BigInteger(s);

  2. Get a byte array containing the two's-complement representation of this BigInteger:

    byte[] b = x.toByteArray();

  3. Convert the byte array to int[] merging consecutive pairs of 8-bit values into 16-bit values like this:

    int[] merge(byte[] b) {
        int[] result = new int[((b.length-1)>>1) + 1];
        for (int i = 0; i < b.length; i++) {
             result[i>>1] |= b[b.length-i-1] << ((i&1)<<3);
        }
        return result;
    }
    
作妖 2024-08-24 03:12:31

我认为没有一个好的方法可以做到这一点,因为内部表示实际上是 2^16 基数。您需要将基于 10 的数字转换为基于 2^16 的数字。

不要使用 x*10^(位置 x),因为在 2^16 基数中没有 10^n 的表示形式。你可以做类似的事情

num = 0
for i=0 to len do
  num = num * 10 + a[i]

I don't think there's a good way to do this as the internal representation actually 2^16 base. You need to convert a 10 based number into a 2^16 based number.

don't use x*10^(position x), because you don't have the representation of 10^n in 2^16 base. You can do something like

num = 0
for i=0 to len do
  num = num * 10 + a[i]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文