【问题标题】:Binary operators on binary numbers in PythonPython中二进制数的二元运算符
【发布时间】:2014-04-28 11:58:04
【问题描述】:

正如我所注意到的,一方面,Python 中有位运算符,例如:8 ^ 10 结果为 2,这很好。 另一方面,有一些方法可以将基数为 10 的整数转换为二进制数,例如bin(2)

我想知道我是否可以将这两者结合起来,我的意思是字符串上没有按位运算符,因此,bin(8) ^ bin(10) 只会引发错误。我猜想在整数上使用位运算符时,Python 的第一步始终是转换。

实际上,当 a 和 b 都是整数的高值并且对它们进行许多按位运算时,我正在考虑如何加快 a ^ b 之类的运算。转换需要太多时间,所以我想首先转换它们,然后才使用位运算符进行操作。 也许将每个数字转换为布尔列表可能会有所帮助,但如果有人有更好的主意,我很感兴趣。

非常感谢您的任何好的建议!

【问题讨论】:

  • 当计算机本身以二进制格式将它们存储在内存中时,为什么要转换这些值? bin(x) x从十进制转换为二进制,它只返回一个0s和1s的字符串来显示你的二进制表示 x.
  • 值得注意的是,bin() 实际上并没有将整数转换为“二进制数”,而是将整数转换为包含数字的二进制表示的字符串。
  • 试试type(bin(x))它只是返回str。所以它是字符串。
  • 就像我上面所说的,我想避免任何不必要的转换。因此,按位运算符仅适用于(10 个基数)整数和布尔值(据我所知),但以二进制计算,然后返回到 10 个基数整数,这似乎有点太多了。现在我得到一个以 10 为底的输入,然后评估按位运算符,即至少 2 次转换和一个操作,然后进行一些比较,然后以 10 为底输出。现在,输入非常大的数字,我的代码赢了没有在合理的时间内回答。
  • 您所说的从 10 进制输入到二进制的转换是在输入时立即完成的。只要您输入 255,它就会转换为 11111111 以便能够存储在内存中。然而,更重要的是,这从来都不是你需要关心的事情。我很欣赏您想编写快速代码,但这种“优化”是徒劳的,所有优化都是如此,直到您分析和识别瓶颈。我向你保证,这不会成为你代码的瓶颈。

标签: python binary bitwise-operators


【解决方案1】:

您似乎假设 Python 在内部将整数存储为十进制数字字符串。那是完全错误的。整数,甚至是任意精度的整数(3.x 中的long),都存储为位串。对两个 Python 整数进行异或运算只是对存储在内存中的位执行本机异或运算。它将 2x 64 位从内存加载到寄存器中,在 CPU 允许的情况下尽可能高效地对这些位进行异或,然后将结果写回内存。无需转换。

老实说,它确实不使用其中的一些 64 位(这用于在乘法中更容易地检测溢出),但它只是通过始终将这些位保留为零来做到这一点.

【讨论】:

  • 嗯,这很尴尬,我应该想到这个..(但我猜我的代码为什么这么慢。希望有点**)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多