x64 visual todos redistribuible paquete microsoft los library descargar visual-studio-2010 visual-c++ built-in

visual studio 2010 - visual - MSVC equivalente a__builtin_popcount?



visual c++ redistributable packages (3)

¿Cuál es el equivalente a __builtin_popcount que se encuentra en GCC y Clang, para MSVC-10?


Con este fragmento de código, obtienes el GCC incorporado al compilar con MSVC:

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

(Obras desde Visual Studio 2008).


El __popcount intrinsic mencionado anteriormente no funciona en ARM, o incluso en todas las CPU x86 (requiere un conjunto de instrucciones ABM ). No debes usarlo directamente; en cambio, si está en x86 / amd64, debe usar el intrínseco __cpuid para determinar en el tiempo de ejecución si el procesador admite popcnt .

Tenga en cuenta que probablemente no desee emitir un cpuid para cada llamada popcnt ; Usted querrá almacenar el resultado en algún lugar. Si su código siempre va a ser de un solo hilo, esto es trivial, pero si tiene que estar seguro de subprocesos, tendrá que usar algo como una Inicialización de una sola vez . Eso solo funcionará con Windows ≥ Vista, sin embargo; Si necesita trabajar con versiones anteriores, deberá utilizar su propio rollo (o usar algo de un tercero).

Para máquinas sin ABM (o si la detección en tiempo de ejecución no vale la pena), hay varias versiones portátiles en Bit Twiddling Hacks (busque "Conjunto de bits de conteo"). Mi versión favorita funciona para cualquier tipo T hasta 128 bits:

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

Si desea una versión incorporada, puede usar el módulo incorporado en fragmentos portátiles (revelación completa: uno de mis proyectos es uno de mis proyectos), que debería funcionar prácticamente en cualquier lugar.


Usando los comentarios proporcionados: