gcc
4.4 似乎是他们添加时的第一个版本int128_t
。我需要使用位移,并且我已经用完了一些位域的空间。
编辑:这可能是因为我在一台 32 位计算机上,没有办法将它用于 32 位计算机(Intel Atom),是吗?我不在乎它是否会生成棘手的慢速机器代码,如果我能按预期进行位移。
我很确定它__int128_t
在早期版本的 gcc 上可用。刚刚检查了 4.2.1 和 FreeBSD 并sizeof(__int128_t)
给出了 16。
你也可以使用图书馆。这样做的好处是它是可移植的(关于平台和编译器),您可以轻松切换到更大的数据类型。我可以推荐的一个是 gmp (即使它的目的不是处理位宽 x,而是你想要的变量)。
任意位数的位移都非常容易。只要记住将溢出的位转移到下一个肢体。就这样
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;
}
您可以使用两个 64 位整数,但是您需要跟踪位之间的移动。