Есть ли способ сделать 128-битные ints на gcc <4.4
gcc
4.4, кажется, когда они добавили int128_t
, и мне нужно использовать смещение битов, и у меня закончилось место для некоторых битовых полей.
Изменить. Возможно, это связано с тем, что я на 32-битном компьютере, нет способа получить его для 32-разрядного компьютера (Intel Atom), есть ли? Мне было бы все равно, если бы он создавал хитрый медленный машинный код, если бы я работал как ожидалось при смещении бит.
Я уверен, что __int128_t
доступен в более ранних версиях gcc. Проверено только 4.2.1, а FreeBSD и sizeof(__int128_t)
- 16.
Вы также можете использовать библиотеку. Это будет иметь то преимущество, что оно переносится (относительно платформы и компилятора), и вы можете легко переключиться на еще больший тип данных. Один из них, который я мог бы порекомендовать, - gmp (даже если его намерение состоит не в том, чтобы обрабатывать bitwidth 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;
}
Аналогично для shift right
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;
}
Вы можете использовать два 64-битных ints, но тогда вам нужно отслеживать бит, перемещающийся между ними.
Другие вопросы по меткам c gcc 128bit или Задайте вопрос