__popcnt16、__popcnt、__popcnt64
Microsoft 固有の仕様
16、32、または 64 ビットの符号なし整数の 1
ビット数 (母数) をカウントします。
構文
unsigned short __popcnt16(
unsigned short value
);
unsigned int __popcnt(
unsigned int value
);
unsigned __int64 __popcnt64(
unsigned __int64 value
);
パラメーター
value
[in] 集団の数を求める16 ビット、32 ビット、または 64 ビットの符号なし整数。
戻り値
value パラメーターの 1
ビット数。
要件
Intrinsic | Architecture |
---|---|
__popcnt16 |
高度なビット操作 |
__popcnt |
高度なビット操作 |
__popcnt64 |
64 ビット モードの高度なビット操作。 |
ヘッダー ファイル<intrin.h>
解説
各組み込みでは popcnt
命令が生成されます。 32 ビット モードでは 64 ビットの汎用レジスタがないため、64 ビットの popcnt
はサポートされません。
popcnt
命令のハードウェア サポートを判断するには、InfoType=0x00000001
で __cpuid
組み込みを呼び出し、CPUInfo[2] (ECX)
のビット 23 を確認します。 命令がサポートされている場合、このビットは 1 になり、それ以外の場合は 0 になります。 組み込みが使用されているコードを popcnt
命令がサポートされないハードウェアで実行すると、結果は予測できません。
例
#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 = __popcnt16(us[i]);
cout << "__popcnt16(0x" << hex << us[i] << ") = " << dec << usr << endl;
}
for (int i=0; i<4; i++) {
uir = __popcnt(ui[i]);
cout << "__popcnt(0x" << hex << ui[i] << ") = " << dec << uir << endl;
}
}
__popcnt16(0x0) = 0
__popcnt16(0xff) = 8
__popcnt16(0xffff) = 16
__popcnt(0x0) = 0
__popcnt(0xff) = 8
__popcnt(0xffff) = 16
__popcnt(0xffffffff) = 32
Microsoft 固有の仕様はここまで
部分的著作権 2007 年、Advanced Micro Devices, Inc.、無断転載を禁じます。 Advanced Micro Devices, Inc. の許可を得て再現