是否有一种 Objective-C 特定方法来计算整数中的位数

Mat*_*ins 4 bit-manipulation objective-c

我想计算 Objective-c 中 32 位整数中设置为 1 的位。有些语言将其作为单个调用:

  • Java 有 Integer.bitCount()
  • C++ 有时有 __popcount()
  • SQL 有 BIT_COUNT()

Objective-C 有等效的吗?否则我会使用:

-(int32_t) BitCounter:(int32_t) v
{
    v = v - ((v >> 1) & 0x55555555);
    v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
    return (((v + (v >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
Run Code Online (Sandbox Code Playgroud)

...这很好,但有些处理器将其作为内置于处理器中的单个命令,自然我想利用它,因为它处于时间关键循环中。

Pau*_*l R 5

gcc、clang__builtin_popcount,它是一个 C 内置函数,可以从 Objective-C 调用:

-(int32_t) BitCounter:(int32_t) v
{
    return __builtin_popcount(v);
}
Run Code Online (Sandbox Code Playgroud)

在具有 SSE 4.2 的现代 x86 平台上,这应该编译为单个指令 ( POPCNT)。