分享方式:


__lzcnt16,__lzcnt,__lzcnt64

Microsoft 特定的

計算16位、32位或64位整數中的前置零數目。

語法

unsigned short __lzcnt16(
   unsigned short value
);
unsigned int __lzcnt(
   unsigned int value
);
unsigned __int64 __lzcnt64(
   unsigned __int64 value
);

參數

value
[in]要掃描前置零的 16 位、32 位或 64 位無符號整數。

傳回值

參數中 value 前置零位的數目。 如果 value 為零,則傳回值是輸入操作數的大小(16、32 或 64)。 如果的最大有效位 value 為一,則傳回值為零。

需求

內建 架構
__lzcnt16 AMD:進階位操作 (ABM)

Intel:Haswell
__lzcnt AMD:進階位操作 (ABM)

Intel:Haswell
__lzcnt64 AMD:64 位模式中的進階位操作 (ABM)。

Intel:Haswell

頭檔<intrin.h>

備註

每個內部函數都會 lzcnt 產生指令。 指令傳回的值 lzcnt 大小與其自變數的大小相同。 在 32 位模式中,沒有 64 位的一般用途緩存器,因此不支援 64 位 lzcnt

若要判斷指令的硬體支援 lzcnt ,請使用呼叫 __cpuid 內部函數, InfoType=0x80000001 並檢查的 CPUInfo[2] (ECX)位 5。 如果支援指令,則此位會是 1,否則為 0。 如果您在不支援 lzcnt 指令的硬體上執行使用內部函數的程式代碼,則結果無法預測。

在不支援指令的 lzcnt Intel 處理器上,指令位元組編碼會以 (位掃描反向) 的形式 bsr 執行。 如果程式代碼可移植性是一個考慮,請考慮改用內部 _BitScanReverse 函數。 如需詳細資訊,請參閱 _BitScanReverse_BitScanReverse64

範例

// 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 特定的

此內容的部分是 Advanced Micro Devices, Inc. 的 Copyright 2007。保留所有權利。 由 Advanced Micro Devices, Inc. 的許可權重現。

另請參閱

編譯程式內部函數