在没有查找表的情况下计算大数的位长度
Calculating bit-length of large numbers without lookup tables
我需要计算floor(log2(n))
,其中n
是最多64位的正整数。
值floor(log2(n))
等于n
减去 1 的位长度,因此称为标题。
我已经实现了以下功能:
uint8_t floorLog2(uint64_t n)
{
uint8_t res = 0;
uint64_t ONE = 1;
for (uint8_t k = 32; k > 0; k >>= 1)
{
if (n >= (ONE << k))
{
n >>= k;
res |= k;
}
}
return res;
}
效果很好,但是...
我已经意识到,对于 6 位数字,它的效率低于直接方法:
uint8_t floorLog2(uint64_t n)
{
uint8_t res = 0;
while (n > 1)
{
n >>= 1;
res += 1;
}
return res;
}
所以我创建了一个组合版本:
uint8_t floorLog2(uint64_t n)
{
uint8_t res = 0;
if (n < 64)
{
while (n > 1)
{
n >>= 1;
res += 1;
}
}
else
{
uint64_t ONE = 1;
for (uint8_t k = 32; k > 0; k >>= 1)
{
if (n >= (ONE << k))
{
n >>= k;
res |= k;
}
}
}
return res;
}
但我真的不喜欢这里的分支(if
/else
(。
由于我多次调用此函数,因此它会影响程序的整体性能。
我在这里缺少更好的方法吗?
uint8_t floorLog2(uint64_t n)
{
uint8_t res = 0;
static const uint64_t ONE = 1;
for (uint8_t k = 128; n >= 64; k >>= 1)
{
if (n >= (ONE << k))
{
n >>= k;
res |= k;
}
}
while (n > 1)
{
n >>= 1;
res += 1;
}
return res;
}
相关文章:
- 在C++中如何在没有pow的情况下进行基础计算
- 如何在不使用乘除运算符的情况下计算 A 的 B 次幂?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- C++在不使用pow或循环的情况下计算一个数字的幂
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 在没有查找表的情况下计算大数的位长度
- 在不创建子矩阵的情况下计算C++矩阵的行列式
- 如何在不使用提取操作员的情况下计算TXT文件中的数量数
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- 在不损失C++或 Python 性能的情况下计算 pi
- 如何在不使用loop或std :: comguate()的情况下计算向量的总和
- 程序不会降低最低分数并在没有它的情况下计算平均值
- 如何遍历二叉树并在不传递值的情况下计算值的出现次数
- 在不使用 strlen() 的情况下计算字符串中的字母
- 在没有外部库的情况下C++计算大量数字
- 在不使用c++中的库函数的情况下,计算不包括null字符的字符串长度
- 尝试在没有opencv calcHist()的情况下计算我自己的直方图
- 一种计算技巧,例如,在每个盒子可以容纳M个物体的情况下,放置N个物体所需的盒子数量
- 如何在没有数学的情况下计算第 n 个根
- 在不使用函数 pow 的情况下计算表达式的总和