分享方式:


__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. 的許可權重現。

另請參閱

編譯器內建函式