Compartir a través de


__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 Architecture
__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.

Consulte también

Intrínsecos del compilador