__lzcnt16, __lzcnt, __lzcnt64
Specifické pro Microsoft
Spočítá počet počátečních nul v 16bitovém, 32bitovém nebo 64bitovém celočíselném čísle.
Syntaxe
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parametry
value
[v] 16bitové, 32bitové nebo 64bitové celé číslo bez znaménka, které hledá počáteční nuly.
Vrácená hodnota
Počet úvodních nul bitů v parametru value
. Pokud value
je nula, návratová hodnota je velikost vstupního operandu (16, 32 nebo 64). Pokud je nejvýznamnější bit value
jedna, je návratová hodnota nula.
Požadavky
Vnitřní | Architektura |
---|---|
__lzcnt16 |
AMD: Pokročilá manipulace s bity (ABM) Intel: Haswell |
__lzcnt |
AMD: Pokročilá manipulace s bity (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Pokročilá manipulace s bity (ABM) v 64bitovém režimu. Intel: Haswell |
Hlavičkový soubor<intrin.h>
Poznámky
Každý z vnitřních objektů generuje lzcnt
instrukce. Velikost hodnoty, kterou instrukce vrátí, lzcnt
je stejná jako velikost argumentu. V 32bitovém režimu nejsou žádné 64bitové registry pro obecné účely, takže 64bitová verze lzcnt
není podporovaná.
Chcete-li určit podporu hardwaru lzcnt
pro instrukce, zavolejte __cpuid
vnitřní s InfoType=0x80000001
a zkontrolujte bit 5 z CPUInfo[2] (ECX)
. Tento bit bude 1, pokud je instrukce podporovaná, a v opačném případě 0. Pokud spustíte kód, který používá vnitřní objekt na hardwaru, který nepodporuje lzcnt
instrukce, budou výsledky nepředvídatelné.
Na procesorech Intel, které nepodporují lzcnt
instrukce, se kódování bajtů instrukce spustí jako bsr
(bitová kontrola obrácená). Pokud se jedná o přenositelnost kódu, zvažte místo toho použití vnitřní funkce _BitScanReverse
. Další informace najdete v tématu _BitScanReverse _BitScanReverse64.
Příklad
// 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
END Microsoft Specific
Části tohoto obsahu jsou copyright 2007 by Advanced Micro Devices, Inc. Všechna práva vyhrazena. Reprodukováno s oprávněním společnosti Advanced Micro Devices, Inc.