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

0

Я создаю класс в 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
}
Теги:
math
numbers
binary
largenumber

2 ответа

1

Я знаю, что вы сказали в своем OP, что "мои цифры будут намного больше, чем любые примитивные типы", но просто выслушайте меня.

Раньше я использовал 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), преобразуется в unsigned long long, который, как мне кажется, имеет максимальное значение 18 446 744 073 709 551 615. Если вам нужны большие значения, удачи!

0

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

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
    Это сработало бы, однако я буду иметь дело с миллионами битов. Мне нужно пропустить преобразование в и int и перейти непосредственно к строке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню