【问题标题】:Python and Bitwise OperationsPython 和按位运算
【发布时间】:2015-09-20 19:31:12
【问题描述】:

Python 如何进行位运算?是从 LSB 到 MSB,还是相反? Python如何对不同位数的数字进行运算?例如,假设我有:

A = 0000 1000 1111 1001 0101
B = 0110 1010
C = (A & B) is not 0

如果 Python 从每个上的 MSB 开始操作,这将评估为 True,但如果它从每个上的 LSB 开始操作,它将评估为 False。

【问题讨论】:

  • 从LSB开始
  • 注意:is not 0 将按预期工作(在 CPython 上)只是由于运气。您必须使用!= 0 来拥有根据语言具有正确语义的程序。可能有一个 python 实现,C 总是 false,因为is not 是比较身份而不是值,与A & B 的值无关。文档非常清楚哪些对象是单例。它们是NoneTrueFalseEllipsisNotImplemented。数字保证为单例。
  • @Bakuriu 是的,实际上我刚刚发现了那个。实际上,这就是引发这个问题的原因。我将两个 200+ 位字符串组合在一起,并不断得到错误的 true 值。
  • 作为参考:仅将isNone 一起使用,或者在需要标记值时使用(在这种情况下,您将拥有:sentinel = object(); #do stuff; if somethign is sentinel)。其他单例几乎不会出现在真正的 Python 代码中,所有其他情况都需要使用 ==

标签: python bitwise-operators


【解决方案1】:

要以二进制形式输入数字,请在前面加上 0b(并省略空格),就像使用 0x 输入十六进制数字一样:

A = 0b00001000111110010101
B = 0b01101010
C = (A & B) is not 0

您可以通过打印出来(例如二进制和十六进制)来检查 python 如何解释它:

print('{0:b} {0:x}'.format(A))
# 1000111110010101 8f95

如您所见:它从 LSB 开始。

在将整数与 is: "is" operator behaves unexpectedly with integers 进行比较时,还要注意一个 python 怪癖。因此== 可能是更安全的选择。

【讨论】:

  • 这不是一个怪癖。 is 检查对象身份== 比较 。用一个代替另一个就像在lists 中使用.append() 而不是.pop(),或者在strs 的情况下使用len 而不是int
  • 奇怪的是,最多 255 的数字是单例(is 将工作到那里)。以上不是。 is== 之间的区别非常合理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2013-01-25
  • 2018-01-28
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多