x是8字节,先用for统计各字节1的个数,然再折叠式地累加各字节的统计数, 最后取低8位,高56位就不知道是什么鬼了,也不用管
long fun_c(unsigned long x){ long val = 0; for (int i = 0; i < 8; ++i){ val += x & 0x0101010101010101; x >>= 1; } val += (val >> 32); val += (val >> 16); val += (val >> 8); return val & 0xff; }