C#base converter

时间:2016-01-03 07:09:52

标签: c# base base-conversion

我偶然发现这个方法应该从10 base到 radix base进行基本转换,所以例如如果我传递 28,16 它应该返回1c是十进制28的十六进制表示

private static string convertTo(long value, int radix)
{
    char[] alphabet = "0123456789abcdefghijklmnopqrstuv".ToCharArray();
    string result = "";

    if (value < radix) {
        return alphabet[value].ToString();
    }

    long index;
    while (value != 0)
    {
        index = value % radix;
        value = Convert.ToInt64(Math.Floor(value / radix));  
        result += alphabet[index].ToString();
    }
    return result;
}

我用PHP重写程序的那部分。通过阅读上面的代码,并手动预测输出,它返回c1,它应返回1c 28,16

我发现这个方法在给定的基础上返回字符串的反向表示, c1 而不是正确 1c

因为我没有C#编译器,所以我无法验证我的发现。

所以这是我的两个问题:

  1. 我的计算是否正确上述方法与 28,16 一起返回 c1
  2. 我想在任何基础上编写符号(数字/字母),以便当我们从左边写到时,基本指数减少1 ,例如在十进制中 representation 312 表示300 (3 * 10 ^ 2) + 10 (1 * 10 ^ 1) + 2 (2 * 10 ^ 0) .. 绝对 总是正确吗?

3 个答案:

答案 0 :(得分:2)

  1. 对我来说,是的。 C#中的片段(实际上)应该返回C1而不是1C。在返回之前,您需要反转字符串 result 。 (或者在创建结果字符串时使用result = string.Concat(alphabet[index].toString());之类的内容)

  2. 这是对的。它也适用于所有其他基础,即如果我们以你的榜样(28),你将有:

  3. 28 = 2 * 10 ^ 1 + 8 * 10 ^ 0(基数10)

    28 = 1 * 16 ^ 1 + 12 * 16 ^ 0(基数16)= 1C

    28 = 3 * 8 ^ 1 + 2 * 8 ^ 0(基数8)= 32

    等等。

答案 1 :(得分:1)

是的,该代码需要反转输出。下面是我在Visual Studio 2015中运行该代码时的结果,以及Locals窗口中的相应输出。

    var ret1 = convertTo(28, 16);
    var ret2 = convertTo(28, 10);
    var ret3 = convertTo(10, 10);

    ret1    "c1"    string
    ret2    "82"    string
    ret3    "01"    string

答案 2 :(得分:1)

是的,你是对的convertTo(28, 16) == c1 代码中的循环应该是:

while (value != 0)
{
    index = value / radix; // implicit integer division  
    value = value % radix;
    result += alphabet[index].ToString();
}

关于你的第二个问题,我认为这也是正确的 - 这对于数学专家来说更是如此。