负数在python中的右移计算

2021年9月9日 / 14次阅读 / Last Modified 2021年9月9日
数值计算

在python中,整数(int)的理解不同于C语言,我们可以将int理解为一个整数对象,可以无限大。一个整数做右移运算,当移动的位数足够多时,结果就是0;但是负数不一样,当移动的位数足够多时,最后的结果是-1。

>>> 12345 >> 10
12
>>> 12345 >> 20
0
>>> -12345 >> 10
-13
>>> -12345 >> 20
-1
>>> -234 >> 10
-1
>>> -456 >> 10
-1

嗯,我还发现一个负数右移的现象:

>>> -6 >> 1
-3
>>> -5 >> 1
-3

-5和-6右移1位的结果是一样的?!

是的,原因如下:

负数在计算机中的表示方式为补码(two's complement),python在做负数右移时,是对负数的bit位直接进行操作,右移后的最高位(MSB)要用1来占位,然后再将此bit序列按照补码的方式,翻译成一个负数。

下面以4bit系统来说明:

-5的补码为1011,右移1位得到1101,1101就是-3(3是0011,反码1100,补码1101);

-6的补码为1010,右移1位还是得到1101,因此结果还是-3。

这也就解释了为什么当负数右移足够多位的时候,最后的结果总是-1。因为,当一直右移时,最后得到的一定是1111,然后再继续右移,因为MSB要用1占位,还是1111不变,1111就是-1的补码。(C语言中的右移应该也是这样的,那天找时间做个测试)

最后啰嗦一点,整数在python中可以无限大,不受固定字节数的限制,这给某些应用做计算提供了很大的方便,使用python写代码,基本上是不需要考虑底层的,python提供的这个虚拟机,做计算很自然。

>>> 1 << 2000
114813069527425452423283320117768198402231770208869520047764273682576626139237031385665948631650626991844596463898746277344711896086305533142593135616665318539129989145312280000688779148240044871428926990063486244781615463646388363947317026040466353970904996558162398808944629605623311649536164221970332681344168908984458505602379484807914058900934776500429002716706625830522008132236281291761267883317206598995396418127021779858404042159853183251540889433902091920554957783589672039160081957216630582755380425583726015528348786419432054508915275783882625175435528800822842770817965453762184851149029376
>>> -1 << 2000
-114813069527425452423283320117768198402231770208869520047764273682576626139237031385665948631650626991844596463898746277344711896086305533142593135616665318539129989145312280000688779148240044871428926990063486244781615463646388363947317026040466353970904996558162398808944629605623311649536164221970332681344168908984458505602379484807914058900934776500429002716706625830522008132236281291761267883317206598995396418127021779858404042159853183251540889433902091920554957783589672039160081957216630582755380425583726015528348786419432054508915275783882625175435528800822842770817965453762184851149029376

-1的左移,得到的就是1的左移,再加个负数符号。

-- EOF --

本文链接:https://www.pynote.net/archives/3761

留言区

《负数在python中的右移计算》有1条留言

您的电子邮箱地址不会被公开。 必填项已用*标注

  • 麦新杰

    在C语言中测试结果一样,负数右移到最后就是-1. [回复]


前一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top