__popcnt16, __popcnt, __popcnt64
Seção específica da Microsoft
Conta o número de bits 1
(contagem populacional) em um inteiro sem sinal de 16, 32 ou 64 bits.
Sintaxe
unsigned short __popcnt16(
unsigned short value
);
unsigned int __popcnt(
unsigned int value
);
unsigned __int64 __popcnt64(
unsigned __int64 value
);
Parâmetros
value
[in] O inteiro sem sinal de 16, 32 ou 64 bits para o qual queremos a contagem populacional.
Valor retornado
O número de bits 1
no parâmetro value.
Requisitos
Intrinsic | Arquitetura |
---|---|
__popcnt16 |
Manipulação avançada de bits |
__popcnt |
Manipulação avançada de bits |
__popcnt64 |
Manipulação avançada de bits no modo de 64 bits. |
Arquivo de cabeçalho<intrin.h>
Comentários
Cada um dos intrínsecos gera a instrução popcnt
. No modo de 32 bits, não há registros de uso geral de 64 bits, portanto, não há suporte para 64 bits popcnt
.
Para determinar o suporte de hardware para a instrução popcnt
, chame o intrínseco __cpuid
com InfoType=0x00000001
e verifique o bit 23 de CPUInfo[2] (ECX)
. Esse bit será 1 se a instrução for compatível e, caso contrário, 0. Se você executar código que usa esse intrínsecos em hardware que não dá suporte à instrução popcnt
, os resultados serão imprevisíveis.
Exemplo
#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 = __popcnt16(us[i]);
cout << "__popcnt16(0x" << hex << us[i] << ") = " << dec << usr << endl;
}
for (int i=0; i<4; i++) {
uir = __popcnt(ui[i]);
cout << "__popcnt(0x" << hex << ui[i] << ") = " << dec << uir << endl;
}
}
__popcnt16(0x0) = 0
__popcnt16(0xff) = 8
__popcnt16(0xffff) = 16
__popcnt(0x0) = 0
__popcnt(0xff) = 8
__popcnt(0xffff) = 16
__popcnt(0xffffffff) = 32
Fim da seção específica da Microsoft
Partes com Copyright 2007 da Advanced Micro Devices, Inc. Todos os direitos reservados. Reproduzido com permissão da Advanced Micro Devices, Inc.