__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 | 体系结构 |
---|---|
__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 部分版权。 经超威半导体公司许可转载