如何在c++中把二进制(1000位)字符串转换为十进制字符串 [关闭]。

问题描述 投票:-1回答:1

我有一个问题。我有一个1000位的二进制数。现在我必须把它转换成一个十进制字符串。我无法做到这一点。即使在使用 long long int 我无法做到这一点。所以我使用字符串的十进制数来存储它们。但我不能够做它知道。任何一个人可以帮助我吗?

c++ string binary decimal
1个回答
3
投票

如果你能使用 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.