__lzcnt16, __lzcnt, __lzcnt64
Khusus Microsoft
Menghitung jumlah nol di depan dalam bilangan bulat 16-, 32-, atau 64-bit.
Sintaks
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parameter
value
[di] Bilangan bulat 16-, 32-, atau 64-bit yang tidak ditandatangani untuk memindai nol di awal.
Nilai hasil
Jumlah bit nol di depan dalam value
parameter . Jika value
nol, nilai yang dikembalikan adalah ukuran operand input (16, 32, atau 64). Jika bit yang paling signifikan adalah value
satu, nilai yang dikembalikan adalah nol.
Persyaratan
Intrinsik | Sistem |
---|---|
__lzcnt16 |
AMD: Advanced Bit Manipulation (ABM) Intel: Haswell |
__lzcnt |
AMD: Advanced Bit Manipulation (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Advanced Bit Manipulation (ABM) dalam mode 64-bit. Intel: Haswell |
File header<intrin.h>
Keterangan
Masing-masing intrinsik menghasilkan lzcnt
instruksi. Ukuran nilai yang dikembalikan lzcnt
instruksi sama dengan ukuran argumennya. Dalam mode 32-bit, tidak ada register tujuan umum 64-bit, sehingga 64-bit lzcnt
tidak didukung.
Untuk menentukan dukungan perangkat keras untuk lzcnt
instruksi, panggil __cpuid
intrinsik dengan InfoType=0x80000001
dan periksa bit 5 dari CPUInfo[2] (ECX)
. Bit ini akan menjadi 1 jika instruksi didukung, dan 0 jika tidak. Jika Anda menjalankan kode yang menggunakan intrinsik pada perangkat keras yang tidak mendukung lzcnt
instruksi, hasilnya tidak dapat diprediksi.
Pada prosesor Intel yang tidak mendukung lzcnt
instruksi, pengodean byte instruksi dijalankan sebagai bsr
(bit scan reverse). Jika portabilitas kode menjadi perhatian, pertimbangkan penggunaan _BitScanReverse
intrinsik sebagai gantinya. Untuk informasi selengkapnya, lihat _BitScanReverse, _BitScanReverse64.
Contoh
// 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 Khusus Microsoft
Bagian dari konten ini adalah Hak Cipta 2007 oleh Perangkat Mikro Tingkat Lanjut, Inc. Hak cipta dilindungi undang-undang. Direproduksi dengan izin dari Advanced Micro Devices, Inc.