__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 的最高有效位为 1,则返回值为零。

要求

Intrinsic 体系结构
__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 指令的硬件支持,请调用具有 InfoType=0x80000001__cpuid 内部函数,并检查 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

结束 Microsoft 专用

这一部分内容由超威半导体公司保留 2007 部分版权。保留所有权利。 经超威半导体公司许可转载

另请参阅

编译器内部函数