【问题标题】:Convert binary string to integer string c++ [duplicate]将二进制字符串转换为整数字符串c ++ [重复]
【发布时间】:2012-08-16 21:41:22
【问题描述】:

可能重复:
Converting string of 1s and 0s into binary value

我想在 C++ 中将二进制字符串转换为整数字符串。例如:

"000000000010" 变为 "2"

我有以下限制:我不能将此字符串转换为整数类型,然后再将其转换为字符串,因为二进制字符串可能非常大!

我已经尝试用stringstream 来做,用std::stringstream::binary 标志插入二进制字符串,然后使用std::dec 标志输出内容,但它不起作用

提前谢谢大家。

【问题讨论】:

  • 欢迎来到 Stack Overflow!我们鼓励您research your questions。如果您有 tried something already,请将其添加到问题中 - 如果没有,请先研究并尝试您的问题,然后再回来。
  • 这听起来像是作业,如果是,请标记它。
  • 为了适应 int 字符串不能很大,因为 int 通常只包含 32 位,使得字符串的有效最大长度为 32 个字符。
  • 这个项目需要最少的研究,你应该能够毫无问题地找到自己。
  • 致任何想要结束这个问题的人:这不是上述问题的完全重复。 OP 明确指出他需要转换为字符串,没有任何整数中间状态,因此对该问题的任何答案都不会在这里起作用。

标签: c++ string binary decimal


【解决方案1】:

您可以从std::string 构造std::bitset,并使用std::bitset::to_ulong 或std::bitset::to_ullong 获取整数。一定要注意字节序,这不是为你做的。

如果您需要整数中的字符串,请使用std::to_string。

【讨论】:

  • 嗯,问题陈述说二进制字符串可能很大,因此,大概 unsigned long long 将无法表示相同的值。我不明白字节序是如何在这里发挥作用的。
  • 正如皮特所说,当我阅读问题时,需要整数 string 作为结果类型,而不是整数类型...
  • 我不能这样做,因为这个数字可以超过一个无符号长长。 :/ 顺便说一句,这不是家庭作业
  • 如果你在某个时候将它转换为整数,它仍然不尊重二进制可能对整数来说太大的事实
  • @nyarlathotep 是的。我错过了。手动字符串算术是现在唯一可能的。
【解决方案2】:

你可以这样做:

  • 创建一个新的输出字符串,包含“0”
  • 对于(反转的)原始字符串的每个字符:
    • 将结果乘以 2(逐位计算,注意进位)
    • 如果数字是'1',则将结果加1(如上)
  • 反转结果(使用std::reverse)

【讨论】:

  • 正如我所说,我不能那样做.. 太大的表示溢出
  • @jav974:我看不出问题——我在这里处理的最大 数字 是一位数(可能是 2 倍),所以它不会超过 18
  • 假设我有一个字符串表示(从右到左)150 乘以 1,然后 100 乘以 0,然后再 200 乘以 1。该字符串的长度为 450。我不知道任何整数类型可以处理 450 位。可能我不明白你邀请我继续的方式:/
  • 为什么要反转?在“1000”上尝试你的算法。没有倒车应该工作,倒车会给你“1”。
  • @TadeuszKopec:对字符串进行操作的自然方式(特别是如果您需要附加一个,这可能是这里的情况)是从左到右;带进位的算术是从低到高进行的,即从右到左——因此最后是反转
【解决方案3】:

在我的脑海中,我将从累加值 0 开始,从右到左读取二进制字符串。对于每个位,将累加值乘以 2,如果该位为 1,则将累加值加 1。如果累加值大于 9,则将其除以 10,并将余数作为字符写出。这将以相反的顺序给出十进制字符。

没关系。这不起作用。

【讨论】:

  • 我无法累积这些值,因为它会溢出代表超过 64 位的字符串(它会!)
  • 突然间,我将转换放在一个函数中,并将基数作为参数传递:-)。
  • @jav974 - 不,累积值不会溢出整数。除以 10 来处理这个问题;它一次只能处理一个数字,它会看到的最大值是 19。
  • @jav974 所以使用超过 64 位的整数类型。 (网上有BigInteger 类。)不管怎样,都会有某种范围限制;只需使用适当大小的整数类型。
  • @PeteBecker:我想应该有一个“合并答案”选项,所以我们不必复制 cmets ;)
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2013-10-29
  • 2017-02-23
  • 2014-08-03
相关资源
最近更新 更多