gcc
4.4似乎是他们添加int128_t
时的第一个版本。我需要使用位移,我已经用完了一些位字段。
编辑:可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗?我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的方式进行位移。
答案 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位整数,但是你需要跟踪它们之间的位移。