She*_*284 6 python python-2.7 python-3.x
我很好奇python声明:
csum = (N * (N + 1)) >> 1
Run Code Online (Sandbox Code Playgroud)
在哪里N = 5和csum = 15.我不明白运营商>>以及本声明中发生了什么.这个行动背后的底层思想是什么?csum应该是向量1:5的累积和.
感谢你对此的看法.
基于Python维基:
x >> y返回x位置向右移位的位y.这与//"ingxby "相同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
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |