Convert.ToString
có thể được sử dụng để chuyển đổi một số thành biểu diễn chuỗi tương đương của nó trong một cơ sở xác định.
Thí dụ:
string binary = Convert.ToString(5, 2); // convert 5 to its binary representation
Console.WriteLine(binary); // prints 101
Tuy nhiên, như được chỉ ra bởi các nhận xét, Convert.ToString
chỉ hỗ trợ tập hợp các cơ sở hạn chế - nhưng thường là đủ - sau: 2, 8, 10 hoặc 16.
Cập nhật (để đáp ứng yêu cầu chuyển đổi sang bất kỳ cơ sở nào):
Tôi không biết bất kỳ phương pháp nào trong BCL có khả năng chuyển đổi số thành bất kỳ cơ số nào, vì vậy bạn sẽ phải viết hàm tiện ích nhỏ của riêng mình. Một mẫu đơn giản sẽ giống như vậy (lưu ý rằng điều này chắc chắn có thể được thực hiện nhanh hơn bằng cách thay thế nối chuỗi):
class Program
{
static void Main(string[] args)
{
// convert to binary
string binary = IntToString(42, new char[] { '0', '1' });
// convert to hexadecimal
string hex = IntToString(42,
new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'});
// convert to hexavigesimal (base 26, A-Z)
string hexavigesimal = IntToString(42,
Enumerable.Range('A', 26).Select(x => (char)x).ToArray());
// convert to sexagesimal
string xx = IntToString(42,
new char[] { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'});
}
public static string IntToString(int value, char[] baseChars)
{
string result = string.Empty;
int targetBase = baseChars.Length;
do
{
result = baseChars[value % targetBase] + result;
value = value / targetBase;
}
while (value > 0);
return result;
}
/// <summary>
/// An optimized method using an array as buffer instead of
/// string concatenation. This is faster for return values having
/// a length > 1.
/// </summary>
public static string IntToStringFast(int value, char[] baseChars)
{
// 32 is the worst cast buffer size for base 2 and int.MaxValue
int i = 32;
char[] buffer = new char[i];
int targetBase= baseChars.Length;
do
{
buffer[--i] = baseChars[value % targetBase];
value = value / targetBase;
}
while (value > 0);
char[] result = new char[32 - i];
Array.Copy(buffer, i, result, 0, 32 - i);
return new string(result);
}
}
Cập nhật 2 (Cải thiện hiệu suất)
Sử dụng bộ đệm mảng thay vì nối chuỗi để xây dựng chuỗi kết quả giúp cải thiện hiệu suất, đặc biệt là trên số lượng lớn (xem phương pháp IntToStringFast
). Trong trường hợp tốt nhất (tức là đầu vào dài nhất có thể), phương pháp này nhanh hơn khoảng ba lần. Tuy nhiên, đối với các số có 1 chữ số (tức là 1 chữ số trong cơ sở mục tiêu), IntToString
sẽ nhanh hơn.