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# 编译器,所以无法验证我的发现。
所以这是我的两个问题:
- 上面的方法调用28, 16 returns c1 我的计算是否正确?
- 我假设符号 (digits/alphabets) 在任何基数中都被写入,因此当我们从左边开始写 时,基数指数减少 1 ,例如在 十进制 表示中 312 表示 300
(3 * 10 ^ 2)
+ 10 (1 * 10 ^ 1)
+ 2 (2 * 10 ^ 0)
.. 是 绝对 总是正确?
对我来说,是的。 C# 中的片段(原样)应该 return C1,而不是 1C。在 returning 之前,您需要反转字符串 result。 (或者在创建 result 字符串时使用 result = string.Concat(alphabet[index].toString());
之类的东西)
没错。它也适用于所有其他基地,即如果我们以您的示例 (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();
}
关于你的第二个问题,我认为这也是正确的——不过这需要数学专家来验证。
我偶然发现了这个方法,它应该将 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# 编译器,所以无法验证我的发现。
所以这是我的两个问题:
- 上面的方法调用28, 16 returns c1 我的计算是否正确?
- 我假设符号 (digits/alphabets) 在任何基数中都被写入,因此当我们从左边开始写 时,基数指数减少 1 ,例如在 十进制 表示中 312 表示 300
(3 * 10 ^ 2)
+ 10(1 * 10 ^ 1)
+ 2(2 * 10 ^ 0)
.. 是 绝对 总是正确?
对我来说,是的。 C# 中的片段(原样)应该 return C1,而不是 1C。在 returning 之前,您需要反转字符串 result。 (或者在创建 result 字符串时使用
result = string.Concat(alphabet[index].toString());
之类的东西)没错。它也适用于所有其他基地,即如果我们以您的示例 (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();
}
关于你的第二个问题,我认为这也是正确的——不过这需要数学专家来验证。