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

发布于 2024-10-30 21:39:10 字数 201 浏览 0 评论 0 原文

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

编辑:可能是因为我使用的是32位计算机,所以无法为32位计算机(Intel Atom)提供它,是吗?如果我能按预期进行位移位工作,我不会关心它是否会生成棘手的缓慢机器代码。

gcc 4.4 seems to be the first version when they added int128_t. I need to use bit shifting and I have run out of room for some bit fields.

Edit: It might be because I'm on a 32-bit computer, there's no way to have it for a 32-bit computer (Intel Atom), is there? I wouldn't care if it generated tricky slow machine code if I would work as expected with bit shifting.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

韵柒 2024-11-06 21:39:10

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

I'm pretty sure that __int128_t is available on earlier versions of gcc. Just checked on 4.2.1 and FreeBSD and sizeof(__int128_t) gives 16.

删除→记忆 2024-11-06 21:39:10

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

You could also use a library. This would have the advantage that it is portable (regarding platform and compiler) and you could easily switch to even bigger datatype. One I could recommend is gmp (even if its intention is not to handle bitwidth x, but variable as big as you want).

此岸叶落 2024-11-06 21:39:10

任意位数的位移非常容易。只需记住将溢出的位转移到下一个分支即可。这

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;
}

Bit shifting is very easy in any arbitrary number of bits. Just remember to shift the overflowed bits to the next limb. That's all

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;
}

Similar for shift right

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;
}
鹊巢 2024-11-06 21:39:10

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

You could use two 64-bit ints, but then you need to keep track of the bits moving between.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文