__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
。
需求
內建 | 架構 |
---|---|
__popcnt16 |
進階位操作 |
__popcnt |
進階位操作 |
__popcnt64 |
64 位模式中的進階位操作。 |
頭檔<intrin.h>
備註
每個內部函數都會 popcnt
產生指令。 在 32 位模式中,沒有 64 位的一般用途緩存器,因此不支援 64 位 popcnt
。
若要判斷指令的硬體支援 popcnt
,請使用呼叫 __cpuid
內部函數, InfoType=0x00000001
並檢查的 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
END Microsoft 特定的
部分著作權 2007 由 Advanced Micro Devices, Inc.保留所有權利。 由 Advanced Micro Devices, Inc. 的許可權重現。