【问题标题】:Should a convert a long binary string before operation on it是否应该在对其进行操作之前转换一个长二进制字符串
【发布时间】:2016-04-18 07:26:42
【问题描述】:

在一个问题中,我应该处理以二进制形式给出的长输入。喜欢

"1000101011111101010100100101010101010101"

我需要在这个问题中使用按位运算符 OR |。我研究了这个运算符的使用,它似乎适用于常规整数而不是二进制。所以我打电话给int(thing, 2)。之后,我使用按位运算符。然而有些事情让我很困扰。 python解释器不是再次将其更改回二进制以对其应用按位或吗?所以这不是重复步骤吗?

没有其他方法可以直接使用这个字符串,也许对所有字母进行迭代是更好的方法?还有另一个关于整数精度的问题。因为有时输入大于 500 个字符,所以我无法将其存储为整数。

我试过这样的事情,想象一下ab 是两个二进制字符串。

for comparison in zip(a, b):
    if any(comparison):
       # Do stuff if OR gives 1

事实证明这确实非常慢。请赐教。

提前致谢。

【问题讨论】:

  • 没有像“回到二进制”这样的步骤。整数(和所有数字)已经以二进制形式存储。所以答案是否定的,没有执行额外的步骤。
  • 确实非常简单。但是,不直接使用字符串(如果存在方法)应该更快吗?
  • 否,因为 CPU 有专门的运算符用于数字的按位运算。
  • 那么我应该尽可能地喜欢按位运算吗?因为它比整数运算快?
  • 注意:“二进制字符串”可能有不同的含义(不是“01”字符串)。相关:Convert a text string to bits and backFastest Bitwise XOR on Data Buffers

标签: python python-2.7 integer bit-manipulation time-complexity


【解决方案1】:

首先肯定使用int(binary_string, 2) 任何其他方法都会花费更长的时间。 (虽然使用 zip 和 any 的 for 循环非常聪明,但不是最优的)

Python 解释器不会将您的数字改回二进制,因为计算机已经将数字作为二进制存储在内存中,它将使用 CPU 指令对 2 个数字进行 OR 操作,而无需先转换它们。没有重复步骤。

【讨论】:

  • 感谢您和评论者,您的帮助很大:)
  • @MaxPythone:Python 中的整数具有无限精度。单个 CPU 指令对有限数(例如 64 位整数)进行操作。如何实现按位运算取决于 Python 实现(例如,CPython 可能使用 30 位数字)。尽管(最终)CPU 可能会执行带有一些数字的OR 指令。 gmpy2 整数运算在大数(数百位)上可能更快。
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多