相关疑难解决方法(0)

快速计算64位整数的log2

一个伟大的编程资源,Bit Twiddling Hacks,提出(这里)以下方法来计算32位整数的log2:

#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
static const char LogTable256[256] = 
{
    -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
    LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
    LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
};

unsigned int v; // 32-bit word to find the log of
unsigned r;     // r will be lg(v)
register …
Run Code Online (Sandbox Code Playgroud)

c lookup 64-bit bit-manipulation 32bit-64bit

45
推荐指数
6
解决办法
3万
查看次数

快速定点pow,log,exp和sqrt

我有一个固定点类(10.22),我需要一个pow,一个sqrt,一个exp和一个日志函数.

唉,我不知道从哪里开始.任何人都可以提供一些有用的文章的链接,或者,还没有给我提供一些代码?

我认为,一旦我有了exp函数,那么实现pow和sqrt变得相对容易.

pow(x,y)=> exp(y*log(x))sqrt(x)=> pow(x,0.5)

它只是那些我发现很难的exp和日志函数(好像我记得我的一些日志规则,我记不起其他的很多了).

据推测,顺便说一句,对于sqrt和pow也会有一个更快的方法,所以即使只是说使用上面概述的方法:)前面的任何指针都会受到赞赏:)

请注意:这是跨平台和纯C/C++代码,所以我不能使用任何汇编程序优化.

c c++ logarithm fixed-point exp

21
推荐指数
3
解决办法
2万
查看次数

在C#中计算整数log2的最快方法是什么?

如何最有效地计算C#中整数(日志基数2)所需的位数?例如:

int bits = 1 + log2(100);

=> bits == 7
Run Code Online (Sandbox Code Playgroud)

c# algorithm math bit-manipulation

11
推荐指数
3
解决办法
1万
查看次数

在 C 中仅使用按位运算符计算 log 的下限?(x)

对于家庭作业,使用 C,我应该制作一个程序,该程序仅使用运算符来查找大于 0 的数字的对数基数 2 ! ~ & ^ | + << >>。我知道我应该向右移动多次,但我不知道如何在没有任何循环或ifs 的情况下跟踪次数。我已经被这个问题困住了好几天,所以任何帮助表示赞赏。

int ilog2(int x) {
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >> 16);
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止。我将最重要的部分传递到最后。

c bit-manipulation logarithm

8
推荐指数
2
解决办法
2万
查看次数

计算没有浮点算术或日志的对数表达式

我需要计算的数学表达式floor(ln(u)/ln(1-p))0 < u < 10 < p < 1Ç具有嵌入式处理器上没有浮点算术和无ln功能.结果是正整数.我知道极限情况(p = 0),我稍后会处理它们......

我想这个解决方案包括拥有up覆盖范围0..UINT16_MAX,并且在查找表中寻找对数,但我无法弄清楚究竟是什么:查找表映射到了什么?

结果不一定是100%精确,近似值可以.

谢谢!

c embedded math logarithm lookup-tables

3
推荐指数
1
解决办法
1110
查看次数