一个伟大的编程资源,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++标准库中,我发现只有一个浮点日志方法.现在我使用log来查找二叉树中的索引级别(floor(2log(index))).
代码(C++):
int targetlevel = int(log(index)/log(2));
Run Code Online (Sandbox Code Playgroud)
我担心对于某些边元素(值为2 ^ n的元素),log将返回n-1.999999999999而不是n.0.这种恐惧是否正确?如何修改我的陈述以便始终返回正确的答案?
如何最有效地计算C#中整数(日志基数2)所需的位数?例如:
int bits = 1 + log2(100);
=> bits == 7
Run Code Online (Sandbox Code Playgroud) 找到2的幂的最快方法是什么,使用一定数量(即2的幂)?
我对数学不是很熟练,所以我不确定如何最好地描述它.但功能将类似于x = 2^y这里y是输出,并且x是输入.这是一个真实表,如果有助于解释它的外观.
0 = f(1)
1 = f(2)
2 = f(4)
3 = f(8)
...
8 = f(256)
9 = f(512)
Run Code Online (Sandbox Code Playgroud)
我已经做了一个这样做的功能,但我担心它不是很有效(或者说优雅).这样做会有更简单,更有效的方法吗?我正在使用它来计算纹理的哪个区域用于缓冲绘制的完成方式,因此每个绘制的对象至少调用一次.这是我到目前为止所做的功能:
uint32 getThePowerOfTwo(uint32 value){
for(uint32 n = 0; n < 32; ++n){
if(value <= (1 << n)){
return n;
}
}
return 32; // should never be called
}
Run Code Online (Sandbox Code Playgroud) 我有一个byte我用于比特标志.我知道在任何给定时间都设置了一个且只有一个位byte.
例如: unsigned char b = 0x20; //(00100000) 6th most bit set
我目前使用以下循环来确定设置了哪个位:
int getSetBitLocation(unsigned char b) {
int i=0;
while( !((b >> i++) & 0x01) ) { ; }
return i;
}
Run Code Online (Sandbox Code Playgroud)
如何最有效地确定设定位的位置?我可以不经迭代地完成这项工作吗?
在 C++ 中,找出存储给定 int 需要多少位的最快方法是什么?
我可以尝试将数字除以 2 多次,但除法很慢。有什么快捷的方法吗?
编辑:
非常感谢各位的回答。当我说int我的帖子时,我的意思是任何 4 字节的整数。例如,如果我存储 30665,我希望得到 15 位的结果。
是否有一种有效的方法来查找数字的log2,假设它是2的幂.我知道明显的方法,如有一张桌子或
for (log2=0;x!=1;x>>=1,log2++);
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更有效/更优雅的方式.
如它是否落在2 ^ 3 - 2 ^ 4,2 ^ 4 - 2 ^ 5等内.返回的数字将是EXPONENT本身(减去偏移量).
如何尽可能快速有效地完成这项工作?这个函数将在一个非常依赖于速度的程序中被调用.这是我当前的代码,但它使用for循环效率太低.
static inline size_t getIndex(size_t numOfBytes)
{
int i = 3;
for (; i < 32; i++)
{
if (numOfBytes < (1 << i))
return i - OFFSET;
}
return (NUM_OF_BUCKETS - 1);
}
Run Code Online (Sandbox Code Playgroud)
非常感谢你!
这是我的代码.
#include <iostream>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include <cmath>
#include <functional>
using namespace std;
void main()
{
cout<<log2(3.0)<<endl;
}
Run Code Online (Sandbox Code Playgroud)
但上面的代码给出了错误.错误代码是:错误C3861:'log2':找不到标识符.如何使用c ++计算log2?
所以我们在C中有这个程序,我们需要使用base-2对数函数,得到n的基数2的对数.这是代码:
#include <math.h>
int partSize(int n) {
return log2(n);
}
Run Code Online (Sandbox Code Playgroud)
但是在编译时,它会给我们以下警告.
sim.c:在函数中
partSize:sim.c:114:警告:内置函数的不兼容隐式声明log2
这是我们使用的命令
gcc $file -o $name.out -lm
Run Code Online (Sandbox Code Playgroud) 请问,有人可以帮我如何用 C 计算简单的 log2 吗?我尝试使用这段代码,但它不起作用:
printf( "log( %f ) = %f\n", x, log2(x) );
Run Code Online (Sandbox Code Playgroud)