__lzcnt16, __lzcnt, __lzcnt64
Microsoft'a Özgü
16, 32 veya 64 bitlik bir tamsayıdaki baştaki sıfır sayısını sayar.
Sözdizimi
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parametreler
value
[in] Baştaki sıfırları taramak için 16, 32 veya 64 bit işaretsiz tamsayı.
Dönüş değeri
Parametresindeki baştaki value
sıfır bit sayısı. Sıfır ise value
, dönüş değeri giriş işleneninin boyutudur (16, 32 veya 64). En önemli biti value
bir ise, dönüş değeri sıfırdır.
Gereksinimler
Içsel | Mimari |
---|---|
__lzcnt16 |
AMD: Gelişmiş Bit Düzenlemesi (ABM) Intel: Haswell |
__lzcnt |
AMD: Gelişmiş Bit Düzenlemesi (ABM) Intel: Haswell |
__lzcnt64 |
AMD: 64 bit modunda Gelişmiş Bit Düzenlemesi (ABM). Intel: Haswell |
intrin.h üst bilgi dosyası<>
Açıklamalar
İçsel değerlerin her biri yönergeyi lzcnt
oluşturur. Yönergenin döndürdüğü değerin lzcnt
boyutu, bağımsız değişkeninin boyutuyla aynıdır. 32 bit modunda 64 bit genel amaçlı yazmaç yoktur, bu nedenle 64 bit lzcnt
desteklenmez.
Yönergeye lzcnt
yönelik donanım desteğini belirlemek için ile iç InfoType=0x80000001
öğesini çağırın __cpuid
ve bit 5'ini CPUInfo[2] (ECX)
denetleyin. Yönerge destekleniyorsa bu bit 1, aksi takdirde 0 olur. Yönergeyi desteklemeyen lzcnt
donanımda iç kodunu kullanan bir kod çalıştırırsanız, sonuçlar tahmin edilemez.
Yönergeyi lzcnt
desteklemeyen Intel işlemcilerde yönerge bayt kodlaması olarak bsr
yürütülür (bit tarama ters). Kod taşınabilirliği önemliyse bunun yerine iç öğesini kullanmayı _BitScanReverse
göz önünde bulundurun. Daha fazla bilgi için bkz . _BitScanReverse, _BitScanReverse64.
Örnek
// 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'a Özgü
Bu içeriğin bazı bölümleri Advanced Micro Devices, Inc. tarafından telif hakkı 2007'dir. Tüm hakları saklıdır. Reproduced with permission from Advanced Micro Devices, Inc.