一个伟大的编程资源,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) 我有一个固定点类(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#中整数(日志基数2)所需的位数?例如:
int bits = 1 + log2(100);
=> bits == 7
Run Code Online (Sandbox Code Playgroud) 对于家庭作业,使用 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)
这是我到目前为止。我将最重要的部分传递到最后。
我需要计算的数学表达式floor(ln(u)/ln(1-p))为0 < u < 1和0 < p < 1在Ç具有嵌入式处理器上没有浮点算术和无ln功能.结果是正整数.我知道极限情况(p = 0),我稍后会处理它们......
我想这个解决方案包括拥有u和p覆盖范围0..UINT16_MAX,并且在查找表中寻找对数,但我无法弄清楚究竟是什么:查找表映射到了什么?
结果不一定是100%精确,近似值可以.
谢谢!