我想在objective-c中计算我的32位整数中设置为1的位。有些语言将此作为单个调用:
是否有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;
}
...这很好,但有些处理器将它作为内置于处理器的单个命令,我自然希望利用它,因为它处于时间关键循环中。
答案 0 :(得分:4)
gcc,clang 等有__builtin_popcount,这是一个内置的C,可以从Objective-C调用:
-(int32_t) BitCounter:(int32_t) v
{
return __builtin_popcount(v);
}
在具有SSE 4.2的现代x86平台上,这应该编译为单个指令(POPCNT
)。