Algorithm 将非十进制数转换为另一个非十进制数
这并不是说要做很多工作,但我知道将一个非十进制数转换为另一个非十进制数的唯一方法是先将数字转换为十进制数,然后再进行第二步将其转换为新的基数。例如,要将456(以7为基数)转换为567(以8为基数),我将计算456的十进制值,然后将该值转换为以8为基数 从7点直接到8点有更好的方式吗?或者任何基地到任何其他基地 以下是我所拥有的:Algorithm 将非十进制数转换为另一个非十进制数,algorithm,base-conversion,Algorithm,Base Conversion,这并不是说要做很多工作,但我知道将一个非十进制数转换为另一个非十进制数的唯一方法是先将数字转换为十进制数,然后再进行第二步将其转换为新的基数。例如,要将456(以7为基数)转换为567(以8为基数),我将计算456的十进制值,然后将该值转换为以8为基数 从7点直接到8点有更好的方式吗?或者任何基地到任何其他基地 以下是我所拥有的: //source_lang and target_lang are just the numeric symbols, they would be "0123
//source_lang and target_lang are just the numeric symbols, they would be "0123456789" if they were decimal, and "0123456789abcdef" if hex.
private string translate(string num, string source_lang, string target_lang)
{
int b10 = 0;
string rv = "";
for (int i=num.Length-1; i>=0; i--){
b10 += source_lang.IndexOf( num[i] ) * ((int)Math.Pow(source_lang.Length, num.Length -1 - i));
}
while (b10 > 0) {
rv = target_lang[b10 % target_lang.Length] + rv;
b10 /= target_lang.Length;
}
return rv;
}
你不是真的在转换成10垒。您正在将其转换为数字数据类型,而不是字符串表示形式。如果有什么区别的话,你要把它转换成二进制:)它值得区分“整数”(本质上没有基数)和“整数的文本表示”(有基数) 依我看,这似乎是一个明智的做法。然而,您的转换例程肯定不是特别有效。我会将您的代码分成
Parse
和Format
方法,然后Convert
方法可以是:
public static string Convert(string text, int sourceBase, int targetBase)
{
int number = Parse(text, sourceBase);
return Format(number, targetBase);
}
(当然,如果您愿意,您可以使用字符串来表示不同的基。但是,如果您确实需要这种灵活性,我会尝试创建一个新类来表示“数字表示”。该类可能应该是其中包含解析
、格式
和转换
的类。)