我的程序中有数学问题。我认为问题很简单,但我不确定使用哪些术语,因此我自己的搜索没有任何用处。
我在一个方法中收到一些值,我唯一知道的(就逻辑而言)是数字将是可以重复的东西。
换句话说,我可以收到的数字是可预测的,并且可能是以下之一
1
2
4
16
256
65536
etc
我需要知道它们出现在哪个索引处。除其他说,1
始终位于索引0
,2
位于索引1
,4
位于索引3
,16
是在索引4
等
我知道我可以写一个很大的转换声明,但我希望公式更整洁。你知道一个存在或任何线索作为我正在使用的数学论坛的名称。
答案 0 :(得分:4)
您列出的数字是2的幂。将数字提升为幂的反函数是对数,因此您使用的是从(使用此处的术语)数字到索引的后退。
var num = 256;
var ind = Math.Log(num, 2);
上面,ind
是num的 base-2对数。此代码适用于任何基础;只需替换2
的基数。如果您只使用2的幂,那么您可以使用基于输入的按位表示更快的特殊情况解决方案;见What's the quickest way to compute log2 of an integer in C#?
答案 1 :(得分:2)
尝试
Math.Log(num, base)
其中base
为2
MSDN:http://msdn.microsoft.com/en-us/library/hd50b6h5.aspx
对数将从你的数字返回你的基数。 但是,如果你的号码确实是2的幂,那就是 否则你必须准确理解你拥有什么,你需要什么 它看起来像数字被驱动到2两次,所以试试这个:
private static int getIndexOfSeries(UInt64 aNum)
{
if (aNum == 1)
return 0;
else if (aNum == 2)
return 1;
else
{
int lNum = (int)Math.Log(aNum, 2);
return 1+(int)Math.Log(lNum, 2);
}
}
UInt64[] Arr = new UInt64[] { 1, 2, 4, 16, 256, 65536, 4294967296 }
的结果是:
Num[0] = 1
Num[1] = 2
Num[2] = 4
Num[3] = 16
Num[4] = 256
Num[5] = 65536
Num[6] = 4294967296 //65536*65536
其中[i]
- 索引
答案 2 :(得分:1)
您应该计算数字的基数2对数
答案 3 :(得分:1)
提示:结果:
0 2
1 4
2 16
3 256
4 65536
5 4294967296
etc.
公式是,给定整数x:
Math.Pow(2, Math.Pow(2, x));
即
2 to the power (2 to the power (x) )
一旦知道了公式,就可以解决x的问题(因为你已经得到答案,我不会通过它)。