所需代码的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::stoi
和std::bitset<>
不在桌面上。
答案 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步:
使用标准库函数stoi()
。它可以实现您的想象,从字符串中提取数字数据并将其存储在整数中。
std::string numberstr = "123";
int numberint = std::stoi(numberstr);
std::cout << numberint << "\n";
现在您将数字作为整数。
对于第2步:
扭转字符串,瞧!您现在拥有数字的二进制表示。
如果你想处理负数(我想你可以),只需在转换前执行检查以查看转换后的整数是否为负,如果是,则将标志设置为true。
在倒车之前检查此标志,并在倒车之前在字符串的末尾添加一个负号。
最终功能如下:
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,希望这有帮助!我写这篇文章很有趣。