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:
-
__popcnt
disponible a través de<intrin.h>
-
_mm_popcnt_u64
con SSE4 y<nmmintrin.h>