千万里不及你
旋转钻头提供了一个优秀的集合,呃,比特旋转黑客,并附上性能/优化讨论。对于您的问题,我最喜欢的解决方案(来自该站点)是“乘和查找”:unsigned int v; // find the number of trailing zeros in 32-bit v int r; // result goes herestatic const int MultiplyDeBruijnBitPosition[32] = {
0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9};r = MultiplyDeBruijnBitPosition[((uint32_t)((v & -v) * 0x077CB531U)) >> 27];有用的参考资料:"用deBruijn序列索引计算机单词中的a 1“-解释上述代码的工作原理。"板代表>比特板>BitScan“-详细分析这一问题,特别侧重于国际象棋编程。