对如何对 python shell 中的 16 位二进制数执行按位运算感到困惑

Confused about how to perform bitwise operations on 16bit binary number in python shell

我正在学习 python 中的按位运算符,因此我尝试在 shell 中进行一些实验。我尝试用 8 位数字进行位操作,这似乎工作正常,但如果我尝试使用 16 位数字,就会发生这种情况:

>>> b = 0010000000000000
>>> b
549755813888

如果我尝试更大的数字,起初输出似乎是正常的:

a = 1011110110011001
>>> a
1011110110011001

>>> b = 1100001110000101
>>> b
1100001110000101

但是当我应用按位运算符时,例如 OR |,然后我再次得到小数输出。

>>> a | b
1125874135965693

我觉得这很令人困惑。二元运算符的结果不应该是二进制的吗?如果是这样,转换发生在哪里?最后,为什么只有当我尝试使用 16 位二进制文​​件时才会出现这种情况?

编辑:我在尝试 8 位时得到以下信息:

>>> c = 00000001
>>> d = 10000000
>>> c | d
10000001

您没有告诉 Python 您正在输入二进制数;与 C 一样,Python 会将 0010000000000000 解释为八进制 (8**13),将 1011110110011001 解释为十进制。请改用 0b 前缀和 bin 函数:

>>> a = 0b1011110110011001
>>> b = 0b1100001110000101
>>> bin(a|b)
'0b1111111110011101'

你的 8 位(Python 也不知道,int 通常是 32 位或 64 位,但最近的版本将无缝过渡到 long 可以达到任何宽度)值被解释为完全相同方法。只是无论前面有多少个零,在任何基数中,1都是1,另一个数字是偶数。尝试 100 | 1000(产生 1004)作为失败的低示例(实际值为 0b1111101000 和 0b1100100)。

要在 Python 中写入二进制文字,您需要在文字前加上 0b 前缀。如 a = 0b1011110110011001。有关详细信息,请参阅 this question

尽管您只使用了 1s 和 0s,但这并不能使您输入的数字成为二进制数:它们是十进制的(或者八进制,如果您开始0).

如果要使用二进制数,请在它们前面加上 0b(假设至少 Python 2.6)。参见 this question

如果您想打印结果,您可能还会发现 bin() 很有用。


EDIT: I get the following when trying 8bits:

>>> c = 00000001
>>> d = 10000000
>>> c | d
10000001

您仍然对 0b 表示法感到困惑。 10000000不是一个8位数字,它是一个十进制数,你至少需要24位来表示它(bin(10000000)0b100110001001011010000000)。

10000000 | 00000001 在 "work" 看来是二进制表示的原因是 00000001(八进制表示)也恰好是十进制的 1。这真的是 0b100110001001011010000000 | 0b000000000000000000000001.

例如,00000010 的十进制形式为 8,因此 10000000 | 0000001010000008。如果您的号码以0开头,则为八进制;如果以0x开头,则为十六进制;如果它以 0b 开头,它是二进制的;否则为十进制。

您的特定用例有点运气 (10000000 | 1)。尝试 10000000 | 1000,您的假设不再有效:那是 10000360

您使用的是按位运算,但您提供的数字中的 1 并不代表单个位。

您可能希望看到的是:

>>> bin(0b10000000 | 0b00001000)
'0b10001000'

这里你提供的数字是二进制格式(0b...),是按位运算的(其他记法也是按位运算的,只是激活的位不是你想的那样他们是)然后你用 bin(...).

把它转回二进制表示