我正在尝试优化一些位打包和拆包例程。为了进行打包,我需要计算存储整数值所需的位数。这是当前的代码。
if (n == -1) return 32;
if (n == 0) return 1;
int r = 0;
while (n)
{
++r;
n >>= 1;
}
return r;
不可移植的是,请使用大多数现代架构上可用的位扫描反向操作码。它被暴露为固有的在 Visual C++ 中。
可移植的是,问题中的代码不需要边缘情况处理。为什么需要一位来存储 0?无论如何,我都会忽略问题的边缘。胆量可以这样有效地完成:
if (n >> 16) { r += 16; n >>= 16; }
if (n >> 8) { r += 8; n >>= 8; }
if (n >> 4) { r += 4; n >>= 4; }
if (n >> 2) { r += 2; n >>= 2; }
if (n - 1) ++r;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)