使用分而治之的技术:
uint64_t a = value;
a ^= (a >> 32); // Fold the 32 MSB over the 32 LSB
a ^= (a >> 16); // reducing the problem by 50%
a ^= (a >> 8); // <-- this can be a good break even point
..
return lookup_table[a & 0xff]; // 16 or 256 entries are typically good
..
折叠程序可以应用到最后:
a ^= (a >> 1);
return a & 1;
在 IA 中,Parity 标志可以在减少到 8 位后直接检索。
a ^= (a >> 4);
uint8_t LUT[16]
停止除法的另一个好处是,因为某些处理器架构可以提供嵌入到 XXM(或 NEON)寄存器中的并行查找表。或者只是 256 项 LUT 的潜在缓存未命中可以简单地超过一轮额外的计算任务。在给定的架构中,最好测量哪种 LUT 大小是最佳的。
最后一个表实际上仅包含 16 位,可以使用以下序列进行模拟:
return ((TRUTH_TABLE_FOR_PARITY) >> (a & 15)) & 1;
其中上述魔法常数的位N编码Parity(N)的布尔值。