C# 基础转换器

C# base converter

我偶然发现了这个方法,它应该将 10 基数转换为 radix 基数,例如,如果我传递 28, 16 它应该 return 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 中的那部分程序。 通过阅读上面的代码,并手动预测输出,returns c1它应该 return 1c for 28, 16

我的发现是此方法 returns 是给定基数中字符串的反向表示,c1 而不是正确的 1c

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

所以这是我的两个问题:

  1. 上面的方法调用28, 16 returns c1 我的计算是否正确?
  2. 我假设符号 (digits/alphabets) 在任何基数中都被写入,因此当我们从左边开始写 时,基数指数减少 1 ,例如在 十进制 表示中 312 表示 300 (3 * 10 ^ 2) + 10 (1 * 10 ^ 1) + 2 (2 * 10 ^ 0).. 是 绝对 总是正确?
  1. 对我来说,是的。 C# 中的片段(原样)应该 return C1,而不是 1C。在 returning 之前,您需要反转字符串 result。 (或者在创建 result 字符串时使用 result = string.Concat(alphabet[index].toString()); 之类的东西)

  2. 没错。它也适用于所有其他基地,即如果我们以您的示例 (28) 为例,您将拥有:

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

等等等等

是的,该代码需要反转输出。以下是我 运行 在 Visual Studio 2015 中编写代码时的结果,以及在 Locals window.

中的相应输出
    var ret1 = convertTo(28, 16);
    var ret2 = convertTo(28, 10);
    var ret3 = convertTo(10, 10);

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

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

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

关于你的第二个问题,我认为这也是正确的——不过这需要数学专家来验证。