我正在用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 :(得分:1)
我知道你在你的OP中说“我的数字会比任何原始类型大得多”,但只是听听我的意见。
在过去,我使用std :: bitset来处理数字的二进制表示,并从各种其他表示中来回转换。 std :: bitset基本上是一个花哨的std :: vector,带有一些附加功能。如果它听起来很有趣,你可以阅读更多关于它的here,但是这里有一些小的愚蠢的示例代码向你展示它是如何工作的:
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'
您也可以通过标准数组表示法访问bitset。顺便说一句,我展示的第二次转换(to_ullong)转换为无符号长多头,我相信其最大值为18,446,744,073,709,551,615。如果你需要更大的价值,祝你好运!
答案 1 :(得分: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溢出。
希望它有所帮助。