【发布时间】:2015-02-10 03:09:30
【问题描述】:
如何有效地计算 128 位整数 (uint128_t) 中前导零的数量?
我知道 GCC 的内置函数:
-
__builtin_clz,__builtin_clzl,__builtin_clzll -
__builtin_ffs,__builtin_ffsl,__builtin_ffsll
但是,这些函数仅适用于 32 位和 64 位整数。
我还找到了一些 SSE 说明:
-
__lzcnt16,__lzcnt,__lzcnt64
您可能猜到了,这些仅适用于 16 位、32 位和 64 位整数。
对于 128 位整数,是否有任何类似的高效内置功能?
【问题讨论】:
-
我假设解决两个 64 位整数,然后组合,对你来说太贵了?
-
好吧,我必须这样做,前提是没有人知道更好的解决方案。但是,一条指令可能比整个移位、转换、分支等内容更有效,也更美观。
-
你可以把丑陋的东西包裹在一个函数里。
-
是什么让您认为您的 uint128_t 正在使用 SSE 寄存器?无论如何,它很可能使用两个 64 位寄存器。 SSE registers don't have a 128-bit FLAGS register so they are less useful for big integer arithmetic。
bsr和lzcnt指令设置零和进位标志,因此您应该能够利用它来发挥自己的优势。
标签: c++ gcc bit-manipulation sse