簡體   English   中英

將許多位轉換為Base 10

[英]Converting many bits to 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
}

我知道您在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)轉換為無符號long long,我相信其最大值為18,446,744,073,709,551,615。 如果您需要更大的價值,祝您好運!

只要迭代(向后) 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溢出。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM