__lzcnt16, __lzcnt, __lzcnt64
Section spécifique à Microsoft
Compte le nombre de zéros non significatifs dans un entier 16-, 32 ou 64 bits.
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
valeur
[in] Entier non signé 16,32 ou 64 bits à analyser pour les zéros non significatifs.
Nombre de bits zéro non significatifs dans le value
paramètre. Si value
elle est égale à zéro, la valeur de retour est la taille de l’opérande d’entrée (16, 32 ou 64). Si le bit le plus significatif est value
un, la valeur de retour est égale à zéro.
Intrinsic | Architecture |
---|---|
__lzcnt16 |
AMD : Manipulation avancée des bits (ABM) Intel : Haswell |
__lzcnt |
AMD : Manipulation avancée des bits (ABM) Intel : Haswell |
__lzcnt64 |
AMD : Manipulation avancée des bits (ABM) en mode 64 bits. Intel : Haswell |
Fichier<d’en-tête intrin.h>
Chacune des intrinsèques génère l’instruction lzcnt
. La taille de la valeur retournée par l’instruction lzcnt
est identique à la taille de son argument. En mode 32 bits, il n’existe aucun registre à usage général 64 bits. Par conséquent, la version 64 bits lzcnt
n’est pas prise en charge.
Pour déterminer la prise en charge matérielle de l’instruction, appelez l’intrinsèque lzcnt
__cpuid
avec InfoType=0x80000001
et vérifiez le bit 5 de CPUInfo[2] (ECX)
. Ce bit sera 1 si l’instruction est prise en charge, et 0 sinon. Si vous exécutez du code qui utilise l’intrinsèque sur le matériel qui ne prend pas en charge l’instruction lzcnt
, les résultats sont imprévisibles.
Sur les processeurs Intel qui ne prennent pas en charge l’instruction lzcnt
, l’encodage d’octet d’instruction est exécuté en tant que bsr
(inverse de l’analyse du bit). Si la portabilité du code est une préoccupation, envisagez plutôt d’utiliser l’intrinsèque _BitScanReverse
. Pour plus d’informations, consultez _BitScanReverse, _BitScanReverse64.
// 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 la section spécifique à Microsoft
Les parties de ce contenu sont copyright 2007 by Advanced Micro Devices, Inc. Tous les droits réservés. Reproduit avec l’autorisation d’Advanced Micro Devices, Inc.