C#公式确定索引

时间:2013-11-07 13:24:30

标签: c# math formula

我的程序中有数学问题。我认为问题很简单,但我不确定使用哪些术语,因此我自己的搜索没有任何用处。

我在一个方法中收到一些值,我唯一知道的(就逻辑而言)是数字将是可以重复的东西。

换句话说,我可以收到的数字是可预测的,并且可能是以下之一

1
2
4
16
256
65536
etc

我需要知道它们出现在哪个索引处。除其他说,1始终位于索引02位于索引14位于索引316是在索引4

我知道我可以写一个很大的转换声明,但我希望公式更整洁。你知道一个存在或任何线索作为我正在使用的数学论坛的名称。

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的问题(因为你已经得到答案,我不会通过它)。