__lzcnt16, __lzcnt, __lzcnt64
Specyficzne dla firmy Microsoft
Zlicza liczby zer wiodących w 16-, 32-lub 64-bitowej liczbie całkowitej.
Składnia
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parametry
wartość
[in] 16-, 32-bitowa lub 64-bitowa liczba całkowita bez znaku w celu skanowania pod kątem zer wiodących.
Wartość zwracana
Liczba bitów zera wiodącego w parametrze value
. Jeśli value
ma wartość zero, zwracana wartość to rozmiar operandu wejściowego (16, 32 lub 64). Jeśli najbardziej znaczący bit value
to jeden, zwracana wartość to zero.
Wymagania
Nieodłączny | Architektura |
---|---|
__lzcnt16 |
AMD: Zaawansowane manipulowanie bitami (ABM) Intel: Haswell |
__lzcnt |
AMD: Zaawansowane manipulowanie bitami (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Advanced Bit Manipulation (ABM) w trybie 64-bitowym. Intel: Haswell |
Plik<nagłówka intrin.h>
Uwagi
Każda z funkcji wewnętrznych generuje instrukcję lzcnt
. Rozmiar wartości zwracanej przez lzcnt
instrukcję jest taki sam jak rozmiar argumentu. W trybie 32-bitowym nie ma rejestrów ogólnego przeznaczenia 64-bitowych, więc 64-bitowe lzcnt
nie jest obsługiwane.
Aby określić obsługę sprzętu lzcnt
instrukcji, wywołaj __cpuid
funkcję wewnętrzną za pomocą InfoType=0x80000001
polecenia i sprawdź bit 5 z CPUInfo[2] (ECX)
. Ten bit będzie mieć wartość 1, jeśli instrukcja jest obsługiwana, a w przeciwnym razie 0. Jeśli uruchamiasz kod korzystający z wewnętrznego sprzętu, który nie obsługuje lzcnt
instrukcji, wyniki są nieprzewidywalne.
Na procesorach Intel, które nie obsługują lzcnt
instrukcji, kodowanie bajtów instrukcji jest wykonywane jako bsr
(odwrotne skanowanie bitowe). Jeśli przenośność kodu jest problemem, rozważ użycie funkcji _BitScanReverse
wewnętrznej. Aby uzyskać więcej informacji, zobacz _BitScanReverse, _BitScanReverse64.
Przykład
// 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
Części tej zawartości to Copyright 2007 firmy Advanced Micro Devices, Inc. Wszelkie prawa zastrzeżone. Odtworzony z uprawnieniami firmy Advanced Micro Devices, Inc.