0

我的程序中有一个数学问题。我认为问题很简单,但我不确定要使用什么术语,因此我自己的搜索没有返回任何有用的信息。

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

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

1
2
4
16
256
65536
etc

我需要知道它们出现在什么索引处。换句话说,1总是在索引处02在索引处14在索引处3,在16索引处4等等。

我知道我可以写一个大的 switch 语句,但我希望一个公式会更整洁。你知道是否存在或任何线索作为我正在使用的数学论坛的名称。

4

4 回答 4

4

您列出的数字是 2 的幂。将数字提高到幂的反函数是对数,所以这就是你用来从(在这里使用你的术语)一个数字倒退到一个索引的方法。

var num = 256;
var ind = Math.Log(num, 2);

上面,ind是num的以 2 为底的对数。此代码适用于任何基础;只需将该基础替换为2. 如果您只打算使用 2 的幂,那么您可以使用基于输入的按位表示更快的特殊情况解决方案;请参阅在 C# 中计算整数 log2 的最快方法是什么?

于 2013-11-07T13:29:02.087 回答
2

尝试

Math.Log(num, base)

base2 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

where [i]- 索引

于 2013-11-07T13:31:02.803 回答
1

您应该计算以 2 为底的对数

于 2013-11-07T13:29:39.907 回答
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 (我不会通过那个,因为你已经得到了答案)。

于 2013-11-07T14:01:37.067 回答