Sdílet prostřednictvím


__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.

Viz také

Vnitřní funkce kompilátoru