Возможный дубликат:
c ++ шаблон для преобразования между десятичной и произвольной базой
Я хотел бы преобразовать экземпляр unsigned int
к примеру std::vector<unsigned int>
в базе X, где X — любое число от 2 до максимального числа unsigned int
может представлять.
РЕДАКТИРОВАТЬ: Я говорил unsigned int
в базе 10, но это получило критические комментарии, и я думаю, что это правильно, поэтому я удалил его, чтобы избежать путаницы.
Есть много вопросов и ответов о SO, которые охватывают что-то вроде itoa
который преобразует в базу 16 или 32 или некоторое небольшое число (с этот itoa
страница реализации будучи отмеченным как хороший ресурс). Я не смог найти хорошее преобразование для баз, намного больших, чем это.
Примечание: производительность не является проблемой (в пределах разумного).
Это должно сделать это.
std::vector<unsigned int> result;
unsigned int base = ...;
unsigned int input = ...;
while(input) {
result.push_back(input%base);
input /= base;
}
Следующий код конвертирует x
к вектору в базе base
, Он также дополняет результирующий вектор дополнительными нулями, если это необходимо для удовлетворения minSize
размер результирующего вектора.
vector<unsigned int> intToAnyBase(unsigned int x, int base, int minSize = 1) {
assert(base >= 2);
// minSize allows us to pad the resulting vector
// with extra zeros at the front if needed
minSize = std::max(1, minSize);
std::vector<unsigned int> v;
while(x > 0) {
res.push_back(x % base);
x /= base;
}
// Append zeros to the "front" to satisfy 'minSize' requirement.
// This also adds support for x
if(v.size() < minSize) {
v.reserve(minSize);
while(v.size() < minSize)
v.push_back(0);
}
std::reverse(v.begin(), v.end());
return v;
}
Обратите внимание, что результирующий вектор инвертируется в функции, так что, например, десятичное 4 производит {1,0,0}
в результате а не {0,0,1}
,
std::vector<unsigned int> toBaseX(unsigned int number, unsigned int base)
{
std::vector<unsigned int> res;
if (number == 0)
{
res.push_back(0);
return res;
}
while (number > 0)
{
unsigned int currentDigit = number % base;
res.push_back(currentDigit);
number /= base;
}
return res;
}