【问题标题】:C# base converterC# 基础转换器
【发布时间】:2016-04-07 01:34:03
【问题描述】:

我偶然发现了这个方法,它应该从 10 基数转换为 radix 基数,所以例如,如果我通过 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,它应该为 28、16 返回 1c em>

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

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

所以这是我的两个问题:

  1. 上面用 28, 16 调用的方法返回 c1 我的计算是否正确?
  2. 我想符号(数字/字母),在任何基数中,都被写成使得基数指数减少 1随着我们从左往右写,例如在 十进制 em> 表示 312 表示 300 (3 * 10 ^ 2) + 10 (1 * 10 ^ 1) + 2 (2 * 10 ^ 0).. 绝对 总是正确吗?李>

【问题讨论】:

  • @GeraldSchneider 正确,这是一个翻转的 c1 (我相信这是上述方法的返回)。如果这一切都正确,我最终会使用 strrev( base_convert( 28, 10, 16 ) ) 来实现该效果。但我不确定我的发现,这就是问题:)
  • 有多种免费的 C# 编译器可用,包括 Visual Studio Community。是什么阻止你测试它?
  • @Jeff 我没有 Windows,我无法使用 VS。如果没有 VS,我将不得不将这个函数包装在一个类中来测试它,但我没有 C# 的技能。
  • 您可以在这里编译和测试C#代码:csharppad.com
  • Linux下也可以使用mono。

标签: c# base base-conversion


【解决方案1】:
  1. 对我来说,是的。 C# 中的 sn-p(原样)应该返回 C1,而不是 1C。在返回之前,您需要反转字符串 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

等等等等

【讨论】:

    【解决方案2】:

    是的,该代码需要反转输出。以下是我在 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
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 由于 value / radix 已经是 long,因为 C# 定义了进行整数除法的 operator / 的重载,因此您应该摆脱 Convert.ToInt64(Math.Floor(
      • 感谢@JeppeStigNielsen 从我身边溜走。
      • 您也必须删除Math.Floor 部分!
      猜你喜欢
      • 1970-01-01
      • 2017-01-20
      • 2017-03-26
      • 1970-01-01
      • 2014-04-21
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多