【问题标题】:Converting a binary formatted string (with leading zeros) to an integer and back again将二进制格式的字符串(带前导零)转换为整数并再次返回
【发布时间】:2017-12-18 08:48:32
【问题描述】:

我已将 4 个字符 ATCG 转换为二进制格式,即

00 replacing A 
11 replacing T 
10 replacing C 
01 replacing G 

所以一个字符串

AGAGAGAGTGATAGA 

转换后的样子

001000100010001011100011001000

一旦我得到这个值,我就会把这个二进制转换成它对应的整数,即

143177928.

问题是,当我想再次回到二进制时,它给了我

0b1000100010001011100011001000

这不是原始字符串的正确表示,因为它省略了 1 之后最左边的所有零。

所以我写了一个实现二进制转换的方法,我知道二进制字符串应该有多长。所以最后我只是从返回的二进制文件中删除 0b 并在最左边添加 0,即

#zeros = length of original binary - length of returned binary (0b removed) 

有没有更好的方法来进行这种转换??

我正在用 python 编写代码。

【问题讨论】:

  • 是的,问题在于您的编码方案...任何数量的前导零都是相同的二进制数。您只能在字符串表示中将数字“零填充”到固定长度

标签: python string python-2.7 binary


【解决方案1】:

您可以在 MSB 之后附加一个标志位以保护所有前导零。

第 1 步:转化

在末尾添加一个“标志”位并转换您的位串。

In [6]: converted_str = '001000100010001011100011001000'

In [9]: num = int('1' + converted_str, 2)

In [10]: num
Out[10]: 1216919752

第 2 步:重新转换

使用format 方法将您的号码转换回位串,同时剥离第一个“标志”位。

In [12]: reconverted_str = format(num, 'b')[1:]

In [13]: reconverted_str
Out[13]: '001000100010001011100011001000'

【讨论】:

  • 它有效.. 比我的步骤少。非常感谢。让我们看看我们是否有其他想法。 :)
【解决方案2】:

使用'{0:0{1}b}'.format(num, num_digits)

这将添加前导 0,直到数字为 num_digits。 'b' 指定应将num 转换为二进制。

【讨论】:

  • 这是我以前堆栈建议的原始方法。但我认为最初添加一个位并最终剥离它更有效。无论如何感谢您的建议。
  • 以什么方式更高效?
  • 这样我不依赖字符串的长度来计算我想要多少个零。使用上述方法,我知道我必须添加和删除一个位,所以我有点避免字符串长度和前导零的变量。
猜你喜欢
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2012-02-05
  • 2021-12-17
相关资源
最近更新 更多