__lzcnt16, __lzcnt, __lzcnt64
Específicos de Microsoft
Cuenta el número de ceros iniciales en un entero de 16, 32 o 64 bits.
Sintaxis
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parámetros
value
[in] El entero sin signo de 16, 32 o 64 bits en el que se buscarán ceros iniciales.
Valor devuelto
El número de bits cero iniciales de un parámetro value
. Si value
es cero, el valor devuelto es el tamaño del operando de entrada (16, 32 o 64). Si el bit más representativo de value
es uno, el valor devuelto es cero.
Requisitos
Intrinsic | Arquitectura |
---|---|
__lzcnt16 |
AMD: manipulación de bits avanzada (ABM) Intel: Haswell |
__lzcnt |
AMD: manipulación de bits avanzada (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Manipulación de bits avanzada (ABM) en modo 64 bits. Intel: Haswell |
Archivo de encabezado<intrin.h>
Comentarios
Cada uno de los intrínsecos genera la instrucción lzcnt
. El tamaño del valor que devuelve la instrucción lzcnt
es el mismo que el tamaño de su argumento. En el modo de 32 bits, no hay registros de uso general de 64 bits, por lo que no se admite el lzcnt
de 64 bits .
Para determinar la compatibilidad de hardware con la instrucción lzcnt
, llame al intrínseco __cpuid
con InfoType=0x80000001
y compruebe el bit 5 de CPUInfo[2] (ECX)
. Este bit será 1 si se admite la instrucción y 0 de lo contrario. Si ejecuta código que usa el intrínseco en hardware que no admite la instrucción lzcnt
, los resultados son impredecibles.
En procesadores Intel que no admiten la instrucción lzcnt
, la codificación de bytes de instrucción se ejecuta como bsr
(análisis de bits inverso). Si la portabilidad del código es un problema, considere la posibilidad de usar el intrínseco _BitScanReverse
en su lugar. Para obtener más información, vea _BitScanReverse, _BitScanReverse64.
Ejemplo
// Compile this test with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;
int main()
{
unsigned short us[3] = {0, 0xFF, 0xFFFF};
unsigned short usr;
unsigned int ui[4] = {0, 0xFF, 0xFFFF, 0xFFFFFFFF};
unsigned int uir;
for (int i=0; i<3; i++) {
usr = __lzcnt16(us[i]);
cout << "__lzcnt16(0x" << hex << us[i] << ") = " << dec << usr << endl;
}
for (int i=0; i<4; i++) {
uir = __lzcnt(ui[i]);
cout << "__lzcnt(0x" << hex << ui[i] << ") = " << dec << uir << endl;
}
}
__lzcnt16(0x0) = 16
__lzcnt16(0xff) = 8
__lzcnt16(0xffff) = 0
__lzcnt(0x0) = 32
__lzcnt(0xff) = 24
__lzcnt(0xffff) = 16
__lzcnt(0xffffffff) = 0
FIN de Específicos de Microsoft
Copyright 2007 de Advanced Micro Devices, Inc en determinadas secciones del contenido. Todos los derechos reservados. Reproducido con el permiso de Advanced Micro Devices, Inc.