在C语言中自定义数据类型

12

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

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

我知道我可以使用GMP库,但我认为创建两个数据类型,都存储像2^1224和2^2448这样的值会更快。这样将减少开销。我将使用卡拉茨巴算法来乘以这些数字,因此我需要执行到数据类型的唯一操作是加法,因为我将把数字分解成适合m128i的小块。

有人能指导我向可以帮助我创建所需整数大小的材料的方向吗?


5
你认为自己编写的代码会比已经高度优化(和调试)的代码更快吗?(虽然,如果你是出于兴趣在做这个,那就继续吧。 :) ) - huon
1个回答

10

如果你需要自己的数据类型(无论是用于数学等方面),你需要使用结构体和函数。

struct bignum_s {
    char bignum_data[1024];
}

(显然,您希望正确地调整大小,这只是一个示例)

大多数人最终也会使用typedef:

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)。即使现在不需要它们,提前做好这些准备将为代码未来的增长和开发奠定基础。


答案已更新,现在 bignum_or 使用传递引用的方式。 - Paul Wintz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接