8

gcc4.4 似乎是他们添加时的第一个版本int128_t。我需要使用位移,并且我已经用完了一些位域的空间。

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

4

4 回答 4

9

我很确定它__int128_t在早期版本的 gcc 上可用。刚刚检查了 4.2.1 和 FreeBSD 并sizeof(__int128_t)给出了 16。

于 2011-04-07T05:41:47.587 回答
4

你也可以使用图书馆。这样做的好处是它是可移植的(关于平台和编译器),您可以轻松切换到更大的数据类型。我可以推荐的一个是 gmp (即使它的目的不是处理位宽 x,而是你想要的变量)。

于 2011-04-08T07:29:11.247 回答
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;
}
于 2013-08-03T00:49:48.703 回答
1

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

于 2011-04-07T05:08:48.850 回答