有没有办法在gcc <4.4上进行128位移位?

问题描述 投票:8回答:4

gcc 4.4似乎是他们添加int128_t时的第一个版本。我需要使用位移,我已经用完了一些位字段。

编辑:可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗?我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移。

c gcc bit-shift 128bit
4个回答
9
投票

我很确定__int128_t可用于早期版本的gcc。刚检查4.2.1和FreeBSD,sizeof(__int128_t)给出16。


4
投票

您也可以使用库。这将具有便携性(关于平台和编译器)的优势,您可以轻松切换到更大的数据类型。我可以推荐的是gmp(即使它的意图不是处理位宽x,而是根据需要变化)。


2
投票

任意位数的位移都非常容易。只记得将溢出的位移到下一个边缘。就这样

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
投票

您可以使用两个64位整数,但是您需要跟踪在它们之间移动的位。

© www.soinside.com 2019 - 2024. All rights reserved.