2024-04-20 13:36:12 发布
网友
w3schools.comdefinePython的右移位逐位运算符为“通过从左侧推入最左侧位的副本来向右移位,并让最右侧位脱落”。他们所说的“从左边推入最左边位的副本”是什么意思?更具体地说,“最左边的一位”是什么意思?它们只是指零吗?我知道我错过了一些或很多东西。如果可以,请帮我理解
w3schools.com的定义更能描述Python2,它有32位整数:1位表示符号(最左边),31位表示大小,以两位补码表示
因此,当它说“推送最左边位的副本”时,意味着符号位向右传播,因此右移负数会返回一个仍然为负数的值
例如,在Python2中,如果取最大的负整数(如中所示,距离零最远),则表示int:
int
>>> i = -sys.maxint - 1 >>> i -2147483648
然后向右移动,仍然会得到一个负数:
>>> i >> 16 -32768
如果将所有位(包括符号位)右移并替换为零,则不会得到该值:取而代之的是32768(0x00008000)
如果改为将i向左移位一位,则会导致32位整数下溢(因为零将被移位到符号位,使其为正,并且幅值将全部为零)。Python 2通过将i强制为Python 2long来保护您不受此影响:
i
long
>>> i << 1 -4294967296L
Python 2long与Python 3整数非常相似
由于Python3非常小心地保持移位运算符的行为与Python2相同,因此如果将Python3整数向右移位16位,将得到相同的结果
但机制是不同的。移位运算符处理整数的概念位表示。文档中的短语是这样的:注意短语,好像:
The result of bitwise operations is calculated as though carried out in two’s complement with an infinite number of sign bits.
Python整数在内部并不是由可变长度的两位补码二进制数表示的:其大小是一个30位数字的序列,符号单独存储,但最好不要担心太多。移位运算符根据概念表示给出结果,而不是实际的物理表示
另一方面,每当您对这样的主题有疑问时,最好直接阅读Python文档,它总是准确的,几乎总是示例性的。Python的受欢迎程度吸引了博客作者,他们中的一些人对自己的主题缺乏安全感,而第三方教程材料往往带有对最初为Python 2编写的内容进行不充分修订的痕迹
如果有4位,比如说0 0 1 0,那么最左边的位是0
0 0 1 0
0
如果有4位,比如说1 0 0 0,那么最左边的位是1
1 0 0 0
1
从字面上看是最左边的一位
根据W3的定义,右移时将使用最左边的位
因此,如果我有4位,1 0 1 0,然后根据W3向右移位,结果是1 1 0 1
1 0 1 0
1 1 0 1
如果我有4位,0 1 1 0,然后根据W3向右移位,结果是0 0 1 1
0 1 1 0
0 0 1 1
但事实并非总是如此。它依赖于实现
例如,在C++中,如果你有一个非符号整数,那么当你向右移位时,最左边的位会被填充上0。即使最左边的位是1,也是如此
w3schools.com的定义更能描述Python2,它有32位整数:1位表示符号(最左边),31位表示大小,以两位补码表示
因此,当它说“推送最左边位的副本”时,意味着符号位向右传播,因此右移负数会返回一个仍然为负数的值
例如,在Python2中,如果取最大的负整数(如中所示,距离零最远),则表示
int
:然后向右移动,仍然会得到一个负数:
如果将所有位(包括符号位)右移并替换为零,则不会得到该值:取而代之的是32768(0x00008000)
如果改为将
i
向左移位一位,则会导致32位整数下溢(因为零将被移位到符号位,使其为正,并且幅值将全部为零)。Python 2通过将i
强制为Python 2long
来保护您不受此影响:Python 2
long
与Python 3整数非常相似由于Python3非常小心地保持移位运算符的行为与Python2相同,因此如果将Python3整数向右移位16位,将得到相同的结果
但机制是不同的。移位运算符处理整数的概念位表示。文档中的短语是这样的:注意短语,好像:
Python整数在内部并不是由可变长度的两位补码二进制数表示的:其大小是一个30位数字的序列,符号单独存储,但最好不要担心太多。移位运算符根据概念表示给出结果,而不是实际的物理表示
另一方面,每当您对这样的主题有疑问时,最好直接阅读Python文档,它总是准确的,几乎总是示例性的。Python的受欢迎程度吸引了博客作者,他们中的一些人对自己的主题缺乏安全感,而第三方教程材料往往带有对最初为Python 2编写的内容进行不充分修订的痕迹
如果有4位,比如说
0 0 1 0
,那么最左边的位是0
如果有4位,比如说
1 0 0 0
,那么最左边的位是1
从字面上看是最左边的一位
根据W3的定义,右移时将使用最左边的位
因此,如果我有4位,
1 0 1 0
,然后根据W3向右移位,结果是1 1 0 1
如果我有4位,
0 1 1 0
,然后根据W3向右移位,结果是0 0 1 1
但事实并非总是如此。它依赖于实现
例如,在C++中,如果你有一个非符号整数,那么当你向右移位时,最左边的位会被填充上0。即使最左边的位是1,也是如此
相关问题 更多 >
编程相关推荐