对于MSVC-10,GCC和Clang中的__builtin_popcount
相当于什么?
答案 0 :(得分:13)
使用提供的评论:
__popcnt
可通过<intrin.h>
_mm_popcnt_u64
与SSE4和<nmmintrin.h>
答案 1 :(得分:11)
使用此代码段,您可以在使用MSVC构建时获得GCC内置:
#ifdef _MSC_VER
# include <intrin.h>
# define __builtin_popcount __popcnt
#endif
(来自Visual Studio 2008)。
答案 2 :(得分:3)
上面提到的__popcount
内在函数不适用于ARM,甚至不适用于所有x86 CPU(它需要ABM指令集)。你不应该直接使用它;相反,如果您使用x86 / amd64,则应使用__cpuid
内在函数在运行时确定处理器是否支持popcnt
。
请注意,您可能不想为每{{}}}次来电发出cpuid
;你想把结果存储在某个地方。如果你的代码总是单线程的,那么这很简单,但是如果你必须是线程安全的,那么你必须使用One-Time Initialization这样的东西。但这只适用于Windows≥Vista;如果你需要使用旧版本,你需要自己动手(或使用第三方的东西)。
对于没有ABM的机器(或者如果运行时检测不值得),Bit Twiddling Hacks处有几个可移植版本(查找&#34;计数位设置&#34;)。我最喜欢的版本适用于最高128位的任何类型popcnt
:
T
如果你想要一个插入式版本,你可以使用the builtin module in portable-snippets(完全披露:portable-snippets是我的项目之一),这应该可以在任何地方使用。