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位整数,但是您需要跟踪在它们之间移动的位。