开发者

Is there any way to do 128-bit shifts on gcc <4.4?

开发者 https://www.devze.com 2023-02-22 11:44 出处:网络
gcc 4.4 seems to be the first version when they added int128_t. I need to use bit shifting and I have run ou开发者_运维知识库t of room for some bit fields.

gcc 4.4 seems to be the first version when they added int128_t. I need to use bit shifting and I have run ou开发者_运维知识库t of room for some bit fields.

Edit: It might be because I'm on a 32-bit computer, there's no way to have it for a 32-bit computer (Intel Atom), is there? I wouldn't care if it generated tricky slow machine code if I would work as expected with bit shifting.


I'm pretty sure that __int128_t is available on earlier versions of gcc. Just checked on 4.2.1 and FreeBSD and sizeof(__int128_t) gives 16.


You could also use a library. This would have the advantage that it is portable (regarding platform and compiler) and you could easily switch to even bigger datatype. One I could recommend is gmp (even if its intention is not to handle bitwidth x, but variable as big as you want).


Bit shifting is very easy in any arbitrary number of bits. Just remember to shift the overflowed bits to the next limb. That's all

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;
}

Similar for 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;
}


You could use two 64-bit ints, but then you need to keep track of the bits moving between.

0

精彩评论

暂无评论...
验证码 换一张
取 消