有没有办法将表示为字符串的数字转换为其二进制等价物?

时间:2015-12-20 12:28:22

标签: c++ c++11

所需代码的shell:

#include <iostream>
#include <string>

std::string str_to_bin(const std::string& str)
{
    //...
}

int main()
{
    std::string str = "123";

    std::cout << str_to_bin(str); //would print 1111011
}

问题标题说明了一切。我已经坚持了一段时间。在STL中有解决方案吗?还是我想念的一些简单的东西?如果没有,我该怎么做呢?也许你可以指点我的方向?而且,速度非常重要。

编辑:该号码可以是任意大小(也大于long long),因此std::stoistd::bitset<>不在桌面上。

2 个答案:

答案 0 :(得分:3)

您可以使用GMP (GNU Multi-Precision)执行此操作。像这样:

#include <gmpxx.h>

std::string str_to_bin(const std::string& str)
{
    mpz_class bignum;
    int rc = bignum.set_str(str, 10);
    if (rc != 0)
        throw std::invalid_argument("bad number: " + str);

    return bignum.get_str(2);
}

或使用传统的C API:

#include <gmp.h>

std::string str_to_bin(const std::string& str)
{
  mpz_t bignum;
  int rc = mpz_set_str(bignum, str.c_str(), 10);
  if (rc != 0)
    throw std::invalid_argument("bad number: " + str);

  char* rawstr = mpz_get_str(nullptr, 2, bignum);
  std::string result(rawstr);
  free(rawstr);
  return result;
}

答案 1 :(得分:0)

好的,让我们分解你在这里需要的过程。 (只有无数种方法中的一种)

  1. 将表示为字符串类型的数字转换为整数类型。
  2. 将中间整数类型转换为以另一种字符串类型保存的二进制数。 (通过函数的返回类型来判断,顺便返回一个整数就可以了,并且可以节省将二进制等价物表示为字符串的麻烦)
  3. 对于第1步:

    使用标准库函数stoi()。它可以实现您的想象,从字符串中提取数字数据并将其存储在整数中。

    std::string numberstr = "123";
    int numberint = std::stoi(numberstr);
    std::cout << numberint << "\n";
    

    现在您将数字作为整数。

    对于第2步:

    1. 此过程涉及将数字从基数10(十进制)转换为基数2(二进制)。
    2. 将数字除以2.
    3. 存储此除法运算的余数和商以供进一步使用。
    4. 余数成为二进制表示的一部分,而商用作下一个被除数。
    5. 此过程重复直到被除数为1,此时它也包含在二进制表示中。
    6. 扭转字符串,瞧!您现在拥有数字的二进制表示。

    7. 如果你想处理负数(我想你可以),只需在转换前执行检查以查看转换后的整数是否为负,如果是,则将标志设置为true。

    8. 在倒车之前检查此标志,并在倒车之前在字符串的末尾添加一个负号。

    9. 最终功能如下:

      std::string str_to_bin(const std::string& str)
      {
          std::string binarystr = ""; // Output string
      
          int remainder;
          int numberint = std::stoi(str);
          bool flagnegative = false;
          // If negative number, beginning of binary equivalent is 1
          if (numberint < 0)
          {
              numberint = abs(numberint);
              flagnegative = true;
          }
          // If number is 0, don't perform conversion simply return 0
          if (numberint == 0)
          {
              binarystr = "0";
              return binarystr;
          }
          std::cout << numberint << "\n";
      
          while (numberint != 1)
          {
              remainder = numberint % 2;
              numberint /= 2;
              std::ostringstream convert; // stream used for the conversion
              convert << remainder;      // insert the textual representation of 'remainder' in the characters in the stream
              binarystr += convert.str();
          }
          std::ostringstream final;
          final << numberint;         // To insert the last (or rather first once reversed) binary number
          binarystr += final.str();
          if (flagnegative == true)
              binarystr += "-";
          std::reverse(binarystr.begin(), binarystr.end());
          return binarystr;
      }
      

      其他人使用bitset发布了STL方法,这可能对你有价值,但我相信简单地复制粘贴在线找到的功能并不好玩。

      通过这种方式,您完全了解引擎盖下的内容! 但是我不能提供速度保证,特别是因为这是使用流。位操作肯定会更有效率。

      Anywho,希望这有帮助!我写这篇文章很有趣。