![](/img/trans.png)
[英]Is it possible to do bit reversal for a 16 bit number only using shift left, xor, and bitwise operations on python
[英]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
100 | 1000
(产生1004)用于失败的低位示例(实际值为0b1111101000和0b1100100)。
尽管您仅使用1
s和0
s,但这不会使您输入的数字成为二进制数:它们是十进制(如果从0
开始则为八进制)。
如果要使用二进制数,请给它们加上0b
前缀(至少假定Python 2.6)。 看到这个问题 。
如果您想打印出结果,您可能还会发现bin()
很有用。
编辑:尝试8位时,我得到以下内容:
>>> c = 00000001 >>> d = 10000000 >>> c | d 10000001
您仍然对0b
表示法感到困惑。 10000000
不是8位数字,而是十进制数字,您至少需要24位才能表示它( bin(10000000)
是0b100110001001011010000000
)。
原因10000000 | 00000001
10000000 | 00000001
似乎在“工作”,就好像它是一个二进制表示形式一样,即00000001
(它是一个八进制表示形式)也恰好是十进制的1。 这真的是0b100110001001011010000000 | 0b000000000000000000000001
0b100110001001011010000000 | 0b000000000000000000000001
。
例如, 00000010
是十进制的8
,因此10000000 | 00000010
10000000 | 00000010
将是10000008
。 如果您的数字以0
开头,则为八进制表示;否则为0
。 如果以0x
,则为十六进制; 如果以0b
开头,则为二进制; 否则为十进制。
您的特定用例有一点运气( 10000000 | 1
)。 尝试10000000 | 1000
10000000 | 1000
,您的假设不再有效:那是10000360
。
您正在使用的操作是按位的,但是您提供的数字中的1
s并不代表单个位。
您可能希望看到的是:
>>> bin(0b10000000 | 0b00001000)
'0b10001000'
在这里,您提供的数字是二进制格式( 0b...
),该操作是按位的(其他表示法也是按位的,只是被激活的位不是您认为的那些)使用bin(...)
将其转换为二进制表示形式。
要在Python中编写二进制文字,您需要在文字前加上0b
前缀。 如a = 0b1011110110011001
。 有关更多详细信息,请参见此问题 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.