对如何对 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。
尽管您只使用了 1
s 和 0
s,但这并不能使您输入的数字成为二进制数:它们是十进制的(或者八进制,如果您开始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 | 00000010
为 10000008
。如果您的号码以0
开头,则为八进制;如果以0x
开头,则为十六进制;如果它以 0b
开头,它是二进制的;否则为十进制。
您的特定用例有点运气 (10000000 | 1
)。尝试 10000000 | 1000
,您的假设不再有效:那是 10000360
。
您使用的是按位运算,但您提供的数字中的 1
并不代表单个位。
您可能希望看到的是:
>>> bin(0b10000000 | 0b00001000)
'0b10001000'
这里你提供的数字是二进制格式(0b...
),是按位运算的(其他记法也是按位运算的,只是激活的位不是你想的那样他们是)然后你用 bin(...)
.
把它转回二进制表示
我正在学习 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。
尽管您只使用了 1
s 和 0
s,但这并不能使您输入的数字成为二进制数:它们是十进制的(或者八进制,如果您开始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 | 00000010
为 10000008
。如果您的号码以0
开头,则为八进制;如果以0x
开头,则为十六进制;如果它以 0b
开头,它是二进制的;否则为十进制。
您的特定用例有点运气 (10000000 | 1
)。尝试 10000000 | 1000
,您的假设不再有效:那是 10000360
。
您使用的是按位运算,但您提供的数字中的 1
并不代表单个位。
您可能希望看到的是:
>>> bin(0b10000000 | 0b00001000)
'0b10001000'
这里你提供的数字是二进制格式(0b...
),是按位运算的(其他记法也是按位运算的,只是激活的位不是你想的那样他们是)然后你用 bin(...)
.