Bagikan melalui


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

Baca juga

Intrinsik pengkompilasi