我有一个问题。我有一个1000位的二进制数。现在我必须把它转换成一个十进制字符串。我无法做到这一点。即使在使用 long long int
我无法做到这一点。所以我使用字符串的十进制数来存储它们。但我不能够做它知道。任何一个人可以帮助我吗?
如果你能使用 boost 或其他多精度库,这很容易。下面是一个使用boost的例子。
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
int main() {
std::string s = "101001";
boost::multiprecision::cpp_int v = 0;
for (auto i: s) {
v *= 2;
if (i == '1') v += 1;
}
std::cout << v << '\n';
return 0;
}
我已经用1000个二进制数字测试过了,效果不错。
现在如果你想自己做,就像手工做一样。
#include <cassert>
#include <iostream>
// convert digit from int to char: '1' -> 1
inline char as_char(int digit) {
assert(digit >= 0 and digit <= 9);
return '0' + digit;
}
// convert a decimal digit from char to int
inline int as_int(char d) {
assert(d >= '0' and d <= '9');
return d - '0';
}
// remove leading 0
inline void trim_leading_zeros(std::string *a) {
std::size_t count = 0;
for (auto i : *a) {
if (i != '0') break;
++count;
}
if (count == a->size()) --count;
a->erase(0, count);
}
// add 1 to a decimal integers written in a string
std::string add_one(const std::string &a) {
std::string res(a.size() + 1, '0');
auto carry = 1;
for (std::size_t i = 0; i < res.size(); ++i) {
auto digit = i < a.size() ? as_int(a[a.size() - 1 - i]) : 0;
auto r = digit + carry;
carry = r / 10;
r = r % 10;
res[res.size() - 1 - i] = as_char(r);
}
if (carry > 0) res[0] = as_char(carry);
trim_leading_zeros(&res);
return res;
}
// multiply a decimal integer written in a string by 2
std::string mult_by_2(const std::string &a) {
std::string res(a.size() + 1, '0');
auto carry = 0;
for (std::size_t i = 0; i < a.size(); ++i) {
auto digit = as_int(a[a.size() - 1 - i]);
auto r = digit * 2 + carry;
carry = r / 10;
r = r % 10;
res[res.size() - 1 - i] = as_char(r);
}
if (carry > 0) res[0] = as_char(carry);
trim_leading_zeros(&res);
return res;
}
int main() {
std::string b = "101001";
std::string v = "0";
for (auto i : b) {
v = mult_by_2(v);
if (i == '1') v = add_one(v);
}
std::cout << v << '\n';
return 0;
}