__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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de