8

gcc4.4 が追加された最初のバージョンのようint128_tです。ビット シフトを使用する必要があり、いくつかのビット フィールドのスペースが不足しています。

編集: 32 ビット コンピューターを使用している可能性があります。32 ビット コンピューター (Intel Atom) 用にそれを使用する方法はありません。ビットシフトで期待どおりに動作する場合、トリッキーで遅いマシンコードが生成されてもかまいません。

4

4 に答える 4

9

__int128_t以前のバージョンのgccで利用できると確信しています。4.2.1とFreeBSDをチェックしたところ、sizeof(__int128_t)16が出ました。

于 2011-04-07T05:41:47.587 に答える
4

ライブラリを使用することもできます。これには、(プラットフォームとコンパイラに関して) 移植可能であり、さらに大きなデータ型に簡単に切り替えることができるという利点があります。私がお勧めできるのは gmp です (その意図がビット幅 x を処理することではなく、必要な大きさの変数を処理することではありません)。

于 2011-04-08T07:29:11.247 に答える
2

ビットシフトは、任意のビット数で非常に簡単です。オーバーフローしたビットを次の肢にシフトすることを忘れないでください。それで全部です

typedef struct {
   int64_t high;
   uint64_t low;
} int128_t;


int128_t shift_left(int128_t v, unsigned shiftcount)
{
   int128_t result;
   result.high = (v.high << shiftcount) | (v.low >> (64 - shiftcount));
   result.low  =  v.low  << shiftcount;
   return result;
}

右シフトも同様

int128_t shift_right(int128_t v, unsigned shiftcount)
{
   int128_t result;
   result.low  = (v.low  >> shiftcount) | (v.high << (64 - shiftcount));
   result.high =  v.high >> shiftcount;
   return result;
}
于 2013-08-03T00:49:48.703 に答える
1

2 つの 64 ビット int を使用できますが、その間を移動するビットを追跡する必要があります。

于 2011-04-07T05:08:48.850 に答える