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

时间:2015-05-04 11:43:44

标签: python shell bit bitwise-operators

我在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

3 个答案:

答案 0 :(得分:4)

你没有告诉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)。

答案 1 :(得分:1)

虽然您只使用10,但这并不会使您以二进制数字输入数字:它们是十进制的(如果以0开头,则为八进制。)

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

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

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

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

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

10000000 | 00000001似乎"工作"就像它是二进制表示一样,00000001(这是一个八进制表示)也恰好是十进制的1。这真的是0b100110001001011010000000 | 0b000000000000000000000001

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

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

您正在使用的操作是按位的,但您提供的数字中的1不代表单个位。

您可能希望看到的是:

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

这里你提供的数字是二进制格式(0b...),操作是按位的(对于其他符号,操作也是按位的,它只是激活的位是不是那些你认为的那些)然后你把它变成带有bin(...)的二进制表示。

答案 2 :(得分:0)

要在Python中编写二进制文字,您需要在文字前面添加0b。与a = 0b1011110110011001中一样。有关详细信息,请参阅this question