Есть ли способ сделать 128-битные ints на gcc <4.4

gcc 4.4, кажется, когда они добавили int128_t, и мне нужно использовать смещение битов, и у меня закончилось место для некоторых битовых полей.

Изменить. Возможно, это связано с тем, что я на 32-битном компьютере, нет способа получить его для 32-разрядного компьютера (Intel Atom), есть ли? Мне было бы все равно, если бы он создавал хитрый медленный машинный код, если бы я работал как ожидалось при смещении бит.

8
задан Roman A. Taycher 07 апр. '11 в 8:02
источник поделиться
4 ответов

Я уверен, что __int128_t доступен в более ранних версиях gcc. Проверено только 4.2.1, а FreeBSD и sizeof(__int128_t) - 16.

8
ответ дан janm 07 апр. '11 в 8:41
источник поделиться

Вы также можете использовать библиотеку. Это будет иметь то преимущество, что оно переносится (относительно платформы и компилятора), и вы можете легко переключиться на еще больший тип данных. Один из них, который я мог бы порекомендовать, - gmp (даже если его намерение состоит не в том, чтобы обрабатывать bitwidth x, а переменную как можно большую).

4
ответ дан flolo 08 апр. '11 в 10:29
источник поделиться

Сдвиг битов очень прост в любом произвольном количестве бит. Просто не забудьте переместить переполненные биты в следующую конечность. Что все

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;
}
2
ответ дан Lưu Vĩnh Phúc 03 авг. '13 в 3:49
источник поделиться

Вы можете использовать два 64-битных ints, но тогда вам нужно отслеживать бит, перемещающийся между ними.

1
ответ дан Andrew Cooper 07 апр. '11 в 8:08
источник поделиться

Другие вопросы по меткам