Есть ли способ сделать 128-битные сдвиги на GCC <4.4? - PullRequest
8 голосов
/ 07 апреля 2011

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

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

Ответы [ 4 ]

9 голосов
/ 07 апреля 2011

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

4 голосов
/ 08 апреля 2011

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

2 голосов
/ 03 августа 2013

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

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;
}
1 голос
/ 07 апреля 2011

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

...