MSVC等同于

对于MSVC-10,在GCC和Clang中找到的__builtin_popcount相当于什么?


使用提供的评论:

  • __popcnt可通过<intrin.h>
  • _mm_popcnt_u64与SSE4和<nmmintrin.h>

  • 通过这段代码,您可以在使用MSVC构建时获得GCC内置代码:

    #ifdef _MSC_VER
    #  include <intrin.h>
    #  define __builtin_popcount __popcnt
    #endif
    

    (从Visual Studio 2008开始工作)。


    上面提到的__popcount内在函数不适用于ARM,甚至不适用于所有x86 CPU(它需要ABM指令集)。 你不应该直接使用它; 相反,如果您使用的是x86 / amd64,则应该使用__cpuid内部函数在运行时确定处理器是否支持popcnt

    请记住,你可能不想为每个popcnt调用发出一个cpuid ; 你会想要在某处存储结果。 如果你的代码总是单线程的,这是微不足道的,但如果你必须是线程安全的,你将不得不使用类似于一次初始化的东西。 这只适用于Windows≥Vista,但是; 如果您需要使用旧版本,则需要推出自己的版本(或者使用第三方版本)。

    对于没有ABM的机器(或者如果运行时检测不值得),在Bit Twiddling Hacks中有几个便携版本(查找“Counting bits set”)。 我最喜欢的版本适用于任何类型为128位的T

    v = v - ((v >> 1) & (T)~(T)0/3);                           // temp
    v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3);      // temp
    v = (v + (v >> 4)) & (T)~(T)0/255*15;                      // temp
    c = (T)(v * ((T)~(T)0/255)) >> (sizeof(T) - 1) * CHAR_BIT; // count
    

    如果你想要一个嵌入式版本,你可以在可移植片段中使用内置模块(完全公开:可移植片段是我的项目之一),它应该在任何地方工作。

    链接地址: http://www.djcxy.com/p/12591.html

    上一篇: MSVC equivalent to

    下一篇: java bitwise left shift