Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
困惑于如何在python shell中对16位二进制数执行按位操作_Python_Shell_Bit_Bitwise Operators - Fatal编程技术网

困惑于如何在python shell中对16位二进制数执行按位操作

困惑于如何在python shell中对16位二进制数执行按位操作,python,shell,bit,bitwise-operators,Python,Shell,Bit,Bitwise Operators,我正在学习python中的位运算符,因此我尝试在shell中进行一些实验。我尝试使用8位数字进行位操作,这似乎正常工作,但如果我尝试使用16位数字,则会发生这种情况: >>> b = 0010000000000000 >>> b 549755813888 如果我尝试一个更大的数字,最初输出似乎正常: a = 1011110110011001 >>> a 1011110110011001 >>> b = 110000111

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

>>> b = 0010000000000000
>>> b
549755813888
如果我尝试一个更大的数字,最初输出似乎正常:

a = 1011110110011001
>>> a
1011110110011001

>>> b = 1100001110000101
>>> b
1100001110000101
但当我应用一个位运算符时,例如
或|,
,我会再次得到一个十进制输出

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

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

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

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

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

您的8位(Python也不知道,int通常是32位或64位,但最新版本将无缝地转换为long,可以转换为任何宽度)值的解释方式完全相同。只是1是1,不管前面有多少个零,在任何基数中,另一个数是偶数。尝试
100 | 1000
(生成1004),以获得一个失败的低示例(实际值为0b1111101000和0b1100100)。

您没有告诉Python您正在输入二进制数;与C一样,Python将0010000000000000解释为八进制(8**13),10111101100111001解释为十进制。改用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=0b101111101100110011001
所示。有关更多详细信息,请参阅。

要在Python中编写二进制文本,需要在文本前面加上
0b
。如
a=0b101111101100110011001
所示。有关更多详细信息,请参见。

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

如果您想使用二进制数,请在它们前面加上
0b
(至少假设Python 2.6)。看

如果你想打印结果,你可能会发现这很有用


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

>>> c = 00000001
>>> d = 10000000
>>> c | d
10000001
>>> c = 00000001
>>> d = 10000000
>>> c | d
10000001
您仍然对
0b
符号感到困惑
10000000
不是一个8位数字,它是一个十进制数字,您至少需要24位来表示它(
bin(10000000)
0B10011000001010000000

10000000 | 00000001
看起来像是二进制表示法一样“起作用”,原因是
00000001
(八进制表示法)恰好也是十进制的1。这实际上是
0b100110001001010000000 | 0b00000000000000000000001

例如,
00000010
是十进制的
8
,因此
10000000 | 00000010
应该是
10000008
。如果您的数字以
0
开头,则表示为八进制;如果它以
0x
开头,则为十六进制;如果它以
0b
开头,则为二进制;否则,它是十进制的

您的特定用例(
10000000 | 1
)有点运气。试试
10000000 | 1000
,你的假设就不起作用了:那就是
10000360

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

您可能希望看到的是:

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

在这里,您提供的数字是二进制格式(
0b…
),操作是按位的(其他符号的操作也是按位的,只是激活的位不是您认为的位),然后您将其转换为二进制表示形式,并使用
bin(…)

尽管您只使用了
1
s和
0
s,但这并不意味着您键入的数字是二进制的:它们是十进制的(如果以
0
开头,则是八进制的)

如果您想使用二进制数,请在它们前面加上
0b
(至少假设Python 2.6)。看

如果你想打印结果,你可能会发现这很有用


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

>>> c = 00000001
>>> d = 10000000
>>> c | d
10000001
>>> c = 00000001
>>> d = 10000000
>>> c | d
10000001
您仍然对
0b
符号感到困惑
10000000
不是一个8位数字,它是一个十进制数字,您至少需要24位来表示它(
bin(10000000)
0B10011000001010000000

10000000 | 00000001
看起来像是二进制表示法一样“起作用”,原因是
00000001
(八进制表示法)恰好也是十进制的1。这实际上是
0b100110001001010000000 | 0b00000000000000000000001

例如,
00000010
是十进制的
8
,因此
10000000 | 00000010
应该是
10000008
。如果您的数字以
0
开头,则表示为八进制;如果它以
0x
开头,则为十六进制;如果它以
0b
开头,则为二进制;否则,它是十进制的

您的特定用例(
10000000 | 1
)有点运气。试试
10000000 | 1000
,你的假设就不起作用了:那就是
10000360

您正在使用的操作是按位的,但是