gcc
4.4 が追加された最初のバージョンのようint128_t
です。ビット シフトを使用する必要があり、いくつかのビット フィールドのスペースが不足しています。
編集: 32 ビット コンピューターを使用している可能性があります。32 ビット コンピューター (Intel Atom) 用にそれを使用する方法はありません。ビットシフトで期待どおりに動作する場合、トリッキーで遅いマシンコードが生成されてもかまいません。
__int128_t
以前のバージョンのgccで利用できると確信しています。4.2.1とFreeBSDをチェックしたところ、sizeof(__int128_t)
16が出ました。
ライブラリを使用することもできます。これには、(プラットフォームとコンパイラに関して) 移植可能であり、さらに大きなデータ型に簡単に切り替えることができるという利点があります。私がお勧めできるのは gmp です (その意図がビット幅 x を処理することではなく、必要な大きさの変数を処理することではありません)。
ビットシフトは、任意のビット数で非常に簡単です。オーバーフローしたビットを次の肢にシフトすることを忘れないでください。それで全部です
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;
}
2 つの 64 ビット int を使用できますが、その間を移動するビットを追跡する必要があります。