python按位处理二进制文件_对如何在python shell中对16位二进制数执行按位运算感到困惑...

我正在学习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)。

这是有道理的,但是解释器会自动将8位识别为没有0b前缀的二进制吗?

您可能想发布一个您认为可行的8位值的示例。

病态更新问题以包含示例

尽管仅使用1和0,但这不会使您输入的数字成为二进制数:它们是十进制的(如果以0开头,则是八进制的)。

如果要使用二进制数,请在它们前面加上0b(至少假定Python 2.6)。看到这个问题。

如果要打印结果,您可能还会发现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似乎是"工作"的,就好像它是二进制表示形式一样,是因为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中编写二进制文字,您需要在文字前加上0b前缀。与a = 0b1011110110011001中一样。有关更多详细信息,请参见此问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值