【问题标题】:custom data type in CC中的自定义数据类型
【发布时间】:2012-03-28 02:49:30
【问题描述】:

我正在使用密码学,需要使用一些非常大的数字。我还在使用新的 Intel 指令进行需要 m128i 数据类型的无进位乘法,这是通过将浮点数据作为其参数的函数加载它来完成的。

我需要存储 2^1223 整数,然后将其平方并存储该值。

我知道我可以使用 GMP 库,但我认为创建两种数据类型会更快,它们都存储值,例如 2^1224 和 2^2448。它的开销会更少。我将使用 karatsuba 来将数字相乘,因此我需要对数据类型执行的唯一操作是加法,因为我会将数字分解以适应 m128i。

有人可以指导我寻找可以帮助我创建所需整数大小的材料。

【问题讨论】:

  • 你认为你自己编写的代码会比已经高度优化(和调试过!)的代码更快吗? (不过,如果您出于兴趣这样做,请照常继续。:))

标签: c types bignum


【解决方案1】:

如果您需要自己的数据类型(无论是用于数学等),您将需要退回到结构和函数。例如:

struct bignum_s {
    char bignum_data[1024];
}

(显然你想调整大小,这只是一个例子)

大多数人最终也会对它进行类型定义:

typedef struct bignum_s bignum;

然后创建带有两个(或其他)指向数字的指针的函数来执行您想要的操作:

/* takes two bignums and ORs them together, putting the result back into a */
void
bignum_or(bignum *a, bignum *b) {
    int i;
    for(i = 0; i < sizeof(a->bignum_data); i++) {
        a->bignum_data[i] |= b->bignum_data[i];
    }
}

您确实希望最终定义几乎所有可能需要的函数,这通常包括内存分配函数 (bignum_new)、内存释放函数 (bignum_free) 和初始化例程 (bignum_init)。即使您现在不需要它们,提前做也可以为以后代码需要增长和开发做好准备。

【讨论】:

  • 注意:示例 or-function 由于按值传递而被破坏。来电者的a 不会改变。
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 2017-08-03
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多