次の方法で共有


__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 が 0 の場合、戻り値は、入力オペランドのサイズ (16、32、または 64) です。 value の最上位ビットが 1 の場合、戻り値は 0 です。

要件

Intrinsic Architecture
__lzcnt16 AMD: Advanced Bit Manipulation (ABM)

Intel: Haswell
__lzcnt AMD: Advanced Bit Manipulation (ABM)

Intel: Haswell
__lzcnt64 AMD: 64 ビット モードの Advanced Bit Manipulation (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 年、Advanced Micro Devices, Inc.、無断転載を禁じます。 Advanced Micro Devices, Inc. の許可を得て再現

関連項目

コンパイラの組み込み