我偶然发现这个方法应该从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#编译器,所以我无法验证我的发现。
所以这是我的两个问题:
(3 * 10 ^ 2)
+ 10 (1 * 10 ^ 1)
+ 2 (2 * 10 ^ 0)
.. 绝对 总是正确吗?答案 0 :(得分:2)
对我来说,是的。 C#中的片段(实际上)应该返回C1而不是1C。在返回之前,您需要反转字符串 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
等等。
答案 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();
}
关于你的第二个问题,我认为这也是正确的 - 这对于数学专家来说更是如此。