Преобразование многих битов в Base 10

Я строю класс в C ++, который может быть использован для хранения сколь угодно больших целых чисел. Я храню их как бинарные в векторе. Мне нужно иметь возможность напечатать этот вектор в базе 10, чтобы человеку было легче понять. Я знаю, что могу преобразовать его в int, а затем вывести это int. Тем не менее, мои цифры будут намного больше, чем любые примитивные типы. Как я могу преобразовать это прямо в строку.

Вот мой код до сих пор. Я новичок в C ++, так что если у вас есть какие-либо другие предложения, которые тоже были бы хорошими. Мне нужна помощь в заполнении string toBaseTenString() функция.

class BinaryInt
{
private:
bool lastDataUser = true;
vector<bool> * data;
BinaryInt(vector<bool> * pointer)
{
data = pointer;
}
public:
BinaryInt(int n)
{
data = new vector<bool>();
while(n > 0)
{
data->push_back(n % 2);
n = n >> 1;
}
}
BinaryInt(const BinaryInt & from)
{
from.lastDataUser = false;
this->data = from.data;
}
~BinaryInt()
{
if(lastDataUser)
delete data;
}
string toBinaryString();
string toBaseTenString();
static BinaryInt add(BinaryInt a, BinaryInt b);
static BinaryInt mult(BinaryInt a, BinaryInt b);
};
BinaryInt BinaryInt::add(BinaryInt a, BinaryInt b)
{
int aSize = a.data->size();
int bSize = b.data->size();
int newDataSize = max(aSize, bSize);
vector<bool> * newData = new vector<bool>(newDataSize);
bool carry = 0;
for(int i = 0; i < newDataSize; i++)
{
int sum = (i < aSize ? a.data->at(i) : 0) + (i < bSize ? b.data->at(i) : 0) + carry;
(*newData)[i] = sum % 2;
carry = sum >> 1;
}
if(carry)
newData->push_back(carry);
return BinaryInt(newData);
}
string BinaryInt::toBinaryString()
{
stringstream ss;
for(int i = data->size() - 1; i >= 0; i--)
{
ss << (*data)[i];
}
return ss.str();
}
string BinaryInt::toBaseTenString()
{
//Not sure how to do this
}

0

Решение

Я знаю, что вы сказали в своем ОП, что «мои цифры будут намного больше, чем у любых примитивных типов», но просто выслушайте меня об этом.

В прошлом я использовал std :: bitset для работы с двоичными представлениями чисел и конвертирования назад и вперед из различных других представлений. std :: bitset — это по сути причудливый std :: vector с некоторыми дополнительными функциями. Вы можете прочитать больше об этом Вот если это звучит интересно, но вот небольшой пример кода, который демонстрирует, как он может работать:

std::bitset<8> myByte;

myByte |= 1;  // mByte = 00000001
myByte <<= 4; // mByte = 00010000
myByte |= 1;  // mByte = 00010001

std::cout << myByte.to_string() << '\n';  // Outputs '00010001'
std::cout << myByte.to_ullong() << '\n';  // Outputs '17'

Вы также можете получить доступ к набору битов с помощью стандартной записи массива. Кстати, второе преобразование, которое я показал (to_ullong), конвертируется в длинную без знака, которая, как мне кажется, имеет максимальное значение 18,446,744,073,709,551,615. Если вам нужны большие значения, удачи!

1

Другие решения

Просто итерируйте (назад) свой vector<bool> и накапливаем соответствующее значение, когда итератор равен true:

int base10(const std::vector<bool> &value)
{
int result = 0;
int bit = 1;

for (vb::const_reverse_iterator b = value.rbegin(), e = value.rend(); b != e; ++b, bit <<= 1)
result += (*b ? bit : 0);

return result;
}

Живая демо.

Осторожно! этот код является лишь руководством, вам нужно позаботиться о переполнении int, если значение довольно велико.

Надеюсь, поможет.

0

По вопросам рекламы [email protected]