Compartilhar via


__lzcnt16, __lzcnt, __lzcnt64

Seção específica da Microsoft

Conta o número de zeros à esquerda em um inteiro de 16, 32 ou 64 bits.

Sintaxe

unsigned short __lzcnt16(
   unsigned short value
);
unsigned int __lzcnt(
   unsigned int value
);
unsigned __int64 __lzcnt64(
   unsigned __int64 value
);

Parâmetros

value
[in] O inteiro sem sinal de 16, 32 ou 64 bits no qual verificar se há zeros à esquerda.

Retornar valor

O número de bits com zero à esquerda no parâmetro value. Se value for zero, o valor retornado será o tamanho do operando de entrada (16, 32 ou 64). Se o bit mais significativo de value for um, o valor retornado será zero.

Requisitos

Intrinsic Arquitetura
__lzcnt16 AMD: manipulação de bits avançada (ABM)

Intel: Haswell
__lzcnt AMD: manipulação de bits avançada (ABM)

Intel: Haswell
__lzcnt64 AMD: manipulação de bits avançada (ABM) no modo de 64 bits.

Intel: Haswell

Arquivo de cabeçalho<intrin.h>

Comentários

Cada um dos intrínsecos gera a instrução lzcnt. O tamanho do valor que a instrução lzcnt retorna é o mesmo que o tamanho de seu argumento. No modo de 32 bits, não há registros de uso geral de 64 bits, portanto, não há suporte para o lzcnt de 64 bits.

Para determinar o suporte de hardware para a instrução lzcnt, chame o intrínseco __cpuid com InfoType=0x80000001 e verifique o bit 5 de CPUInfo[2] (ECX). Se a instrução tiver suporte, esse bit será 1, caso contrário, 0. Se você executar código que usa o intrínseco em hardware que não dá suporte à instrução lzcnt, os resultados serão imprevisíveis.

Em processadores Intel sem suporte para a instrução lzcnt, a codificação de bytes de instrução é executada como bsr (verificação de bits inversa). Se a portabilidade do código for uma preocupação, considere o uso do intrínseco _BitScanReverse. Para obter mais informações, consulte _BitScanReverse, _BitScanReverse64.

Exemplo

// 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

Fim da seção específica da Microsoft

Partes deste conteúdo têm Copyright 2007 da Advanced Micro Devices, Inc. Todos os direitos reservados. Reproduzido com permissão da Advanced Micro Devices, Inc.

Confira também

Compilador intrínsecos