__lzcnt16, __lzcnt, __lzcnt64
Sezione specifica Microsoft
Conta il numero di zeri iniziali in un intero a 16, a 32 o a 64 bit.
Sintassi
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parametri
value
[in] Intero senza segno a 16, 32 o 64 bit per cercare zeri iniziali.
Valore restituito
Numero di bit zero iniziali nel value
parametro . Se value
è zero, il valore restituito corrisponde alla dimensione dell'operando di input (16, 32 o 64). Se il bit più significativo di value
è uno, il valore restituito è zero.
Requisiti
Intrinsic | Architettura |
---|---|
__lzcnt16 |
AMD: Advanced Bit Manipulation (ABM) Intel: Haswell |
__lzcnt |
AMD: Advanced Bit Manipulation (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Advanced Bit Manipulation (ABM) in modalità a 64 bit. Intel: Haswell |
<File di intestazione intrin.h>
Osservazioni:
Ognuna delle funzioni intrinseche genera l'istruzione lzcnt
. La dimensione del valore restituito dall'istruzione lzcnt
corrisponde alla dimensione del relativo argomento. In modalità a 32 bit non sono presenti registri per utilizzo generico a 64 bit, quindi il bit a 64 bit lzcnt
non è supportato.
Per determinare il supporto hardware per l'istruzione lzcnt
, chiamare l'intrinseco __cpuid
con InfoType=0x80000001
e controllare il bit 5 di CPUInfo[2] (ECX)
. Questo bit sarà 1 se l'istruzione è supportata e 0 in caso contrario. Se si esegue codice che usa l'intrinseco sull'hardware che non supporta l'istruzione lzcnt
, i risultati sono imprevedibili.
Nei processori Intel che non supportano l'istruzione lzcnt
, la codifica dei byte di istruzioni viene eseguita come bsr
(analisi bit inversa). Se la portabilità del codice è un problema, prendere in considerazione l'uso dell'intrinseco _BitScanReverse
. Per altre informazioni, vedere _BitScanReverse, _BitScanReverse64.
Esempio
// 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
Fine sezione specifica Microsoft
Parti di questo contenuto sono Copyright 2007 di Advanced Micro Devices, Inc. Tutti i diritti riservati. Riprodotto con l'autorizzazione da Advanced Micro Devices, Inc.