关于按位运算符语句的讨论

She*_*284 6 python python-2.7 python-3.x

我很好奇python声明:

csum = (N * (N + 1)) >> 1
Run Code Online (Sandbox Code Playgroud)

在哪里N = 5csum = 15.我不明白运营商>>以及本声明中发生了什么.这个行动背后的底层思想是什么?csum应该是向量1:5的累积和.

感谢你对此的看法.

Kas*_*mvd 5

基于Python维基:

x >> y 返回x位置向右移位的位y.这与//"ing xby "相同2**y.

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

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

In [5]: 30 >> 1
Out[5]: 15
Run Code Online (Sandbox Code Playgroud)

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

In [6]: bin(30)
Out[6]: '0b11110'
Run Code Online (Sandbox Code Playgroud)

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

01111
Run Code Online (Sandbox Code Playgroud)

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

In [11]: int('01111', 2)
Out[11]: 15
Run Code Online (Sandbox Code Playgroud)

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

In [12]: from operator import rshift
In [13]: rshift(30, 1)
Out[13]: 15
Run Code Online (Sandbox Code Playgroud)

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

正如python wiki和@eryksun所指出的那样,您也可以将右移操作视为将30(左侧数字)除以2 1(右侧数字),将数字转换为更容易解释系数为2的幂.

bin(30)等于11110:

1*2 4 + 1*2 3 + 1*2 2 + 1*2 1 + 0*2 0

通过与2分开,你会得到:

1*2 3 + 1*2 2 + 1*2 1 + 1*2 0 + 0 = 8 + 4 + 2 + 1 = 15