C语言中popcnt函数的简单实现:
int popcnt(uint64_t x) {
int s = 0;
for (int i = 0; i < 64; i++) {
if ((x << i) & 1 == 1) s++;
}
return s;
}
我正在使用内联汇编语言(x86-64)来实现popcnt,
int asm_popcnt(uint64_t x) {
int i = 0, sum = 0;
uint64_t tmp = 0;
asm ( ".Pct: \n\t"
"movq %[xx], %[tm]\n\t"
"andq $0x1, %[tm]\n\t"
"test %[tm], %[tm]\n\t"
"je .Grt \n\t"
"incl %[ss] \n\t"
".Grt: \n\t"
"shrq $0x1, %[xx]\n\t"
"incl %[ii] \n\t"
"cmpl $0x3f, %[ii]\n\t"
"jle .Pct \n\t"
: [ss] "+r"(sum)
: [xx] "r"(x) , [ii] "r"(i),
[tm] "r"(tmp)
);
return sum;
}
但收到了WA(在线评委)
我在我的计算机上测试了 2 的所有幂(从 0x1 到 (0x1 << 63)),它返回 1,这表明我的 asm_popcnt 可以识别任何 64_bits 整数的所有位,因为所有其他整数只是 0x1、0x2、 0x4 等(例如,0x11a = 0x2“或”0x8“或”0x10“或”0x100)。因此,OJ 不应该返回“WA”。我的代码有什么问题吗?跳转指令?