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

时间:2011-04-07 05:02:00

标签: c gcc bit-shift 128-bit

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

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

答案 2 :(得分: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;
}

答案 3 :(得分:1)

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