python - 围绕按位运算符语句的讨论

标签 python python-2.7 python-3.x

我很好奇一条python语句:

csum = (N * (N + 1)) >> 1

其中 N = 5csum = 15。我不明白运算符 >>> 以及此语句中发生的事情。此操作背后的幕后想法是什么? csum 应该是向量 1:5 的累加和。

感谢您对此的想法。

最佳答案

基于 Python wiki :

x >> y Returns x with the bits shifted to the right by y places. This is the same as //'ing x by 2**y.

在你的语句中,python 首先计算 (N * (N + 1)) 部分,然后在结果和数字 1 之间执行 >>> 操作:

In [4]: (N * (N + 1))
Out[4]: 30

In [5]: 30 >> 1
Out[5]: 15

好吧,为了更好的演示,您可以使用 bin() 函数简单地将整数转换为二进制:

In [6]: bin(30)
Out[6]: '0b11110'

现在将位右移 1,您将得到以下数字:

01111

现在使用 int() 和 2 作为基数将结果转换为整数:

In [11]: int('01111', 2)
Out[11]: 15

作为计算右移操作的另一种替代方法,您还可以使用 operator.rshift() 函数:

In [12]: from operator import rshift
In [13]: rshift(30, 1)
Out[13]: 15

阅读更多:https://en.wikipedia.org/wiki/Arithmetic_shift

正如 python wiki 和@eryksun 指出的那样,您还可以将右移操作视为将 30(左侧数字)除以 21(右侧数字),它将当您将数字转换为 2 次幂的系数时更容易解释。

bin(30) 等于 11110 即:

1*24 + 1*23 + 1*22 + 1*21 + 0*20

除以 2 你会得到:

1*23 + 1*22 + 1*21 + 1*20 + 0 = 8 + 4 + 2 + 1 = 15

关于python - 围绕按位运算符语句的讨论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43650548/

相关文章:

python - 在循环中按索引遍历列表列表,以重新格式化字符串

python - python模块中命名空间中的命名冲突

python - 用python解析二进制格式

python - 为什么Python中的类对象可以继承私有(private)函数

python - 如何在 Python 中获取表单字段名称和值?

python-2.7 - MarkupSafe、SQLAlchemy 和 pycrypto 失败,因为 wheel 构建失败

Python 2.7 socket.timeout 行为

python - 如何更新播放列表中的所有 Youtube 视频描述?

python - 如何在 PyQt 中更改 QInputDialog 的字体大小?

Python 简单的裸对象