__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.
Valor retornado
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.