3 回答

TA貢獻1875條經(jīng)驗 獲得超3個贊
這在某種程度上是一種特殊情況,特別是因為您沒有指定要查找的平臺,但是在GCC中,您可以使用所謂的mode(TI)來獲取(綜合)128位操作,實例:
typedef unsigned int uint128_t __attribute__((mode(TI)));
uint64_t x = 0xABCDEF01234568;
uint64_t y = ~x;
uint128_t result = ((uint128_t) x * y);
printf("%016llX * %016llX -> ", x, y);
uint64_t r1 = (result >> 64);
uint64_t r2 = result;
printf("%016llX %016llX\n", r1, r2);
不過,這僅適用于64位處理器。
一種或另一種方式,您正在尋找多重精度算法來解決此問題。mode(TI)將使編譯器為您生成操作,否則必須顯式編寫它們。
您可以使用通用的bigint包;我知道的C ++中包括數(shù)字理論軟件包LiDIA和NTL,以及用于Crypto ++和Botan中的加密代碼的bigint軟件包)。加上當然還有GnuMP,它是規(guī)范的C MPI庫(它也具有C ++包裝器,盡管上次查看時似乎文獻記載很少)。所有這些設計的速度都很快,但也可能針對更大的數(shù)字(1000+位)進行了調整,因此在128位時,您可能要處理很多開銷。(另一方面,您不會說這是否重要)。而且所有這些(與bigint-cpp軟件包(即GPL一樣,不是BSD還是LGPL))-不確定是否重要-但這可能很重要。
您也可以編寫一個自定義的uint128_t類型的類型。通常,這種類將實現(xiàn)與常規(guī)MPI類幾乎相同的算法,只是將其硬編碼為僅包含2個或4個元素。如果您對如何實現(xiàn)這種算法感到好奇,可以參考《應用密碼學手冊》第14章。
當然,如果您實際上不需要所有的算術運算(尤其是除法和模運算,則相當棘手),則手動進行操作會更容易。例如,如果您只需要跟蹤一個假設可能溢出64位的計數(shù)器,則可以將其表示為一對64位長的long,然后手動進行進位:
unsigned long long ctrs[2] = { 0 };
void increment() {
++ctrs[0];
if(!ctrs[0]) // overflow
++ctrs[1];
}
當然,與一般的MPI包或自定義的uint128_t類相比,處理哪個當然要簡單得多。
- 3 回答
- 0 關注
- 1067 瀏覽
添加回答
舉報