每个人都认为右移位运算符的定义不同于w3schools.com。我错过了什么?

2024-04-20 13:36:12 发布

您现在位置:Python中文网/ 问答频道 /正文

w3schools.comdefinePython的右移位逐位运算符为“通过从左侧推入最左侧位的副本来向右移位,并让最右侧位脱落”。他们所说的“从左边推入最左边位的副本”是什么意思?更具体地说,“最左边的一位”是什么意思?它们只是指零吗?我知道我错过了一些或很多东西。如果可以,请帮我理解


Tags: 副本运算符移位w3schoolscomdefinepython
2条回答

w3schools.com的定义更能描述Python2,它有32位整数:1位表示符号(最左边),31位表示大小,以两位补码表示

因此,当它说“推送最左边位的副本”时,意味着符号位向右传播,因此右移负数会返回一个仍然为负数的值

例如,在Python2中,如果取最大的负整数(如中所示,距离零最远),则表示int

>>> i = -sys.maxint - 1
>>> i
-2147483648

然后向右移动,仍然会得到一个负数:

>>> i >> 16
-32768

如果将所有位(包括符号位)右移并替换为零,则不会得到该值:取而代之的是32768(0x00008000)

如果改为将i向左移位一位,则会导致32位整数下溢(因为零将被移位到符号位,使其为正,并且幅值将全部为零)。Python 2通过将i强制为Python 2long来保护您不受此影响:

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

如果有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,也是如此

相关问题 更多 >