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

时间:2017-04-27 06:50:50

标签: python python-2.7 python-3.x

我对python语句感到好奇:

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

其中N = 5csum = 15。我不理解运算符>>以及本声明中发生了什么。这个行动背后的底层思想是什么? csum应该是向量1:5的累积和。

欣赏你对此的看法。

2 个答案:

答案 0 :(得分:5)

基于Python wiki

  

x >> y   返回x,其位数向右移动y个位置。这个   与x的{​​{1}}相同。

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

>>

好吧,为了更好的演示,你可以使用In [4]: (N * (N + 1)) Out[4]: 30 In [5]: 30 >> 1 Out[5]: 15 函数简单地将整数转换为二进制:

bin()

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

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

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

int()

作为计算右移操作的另一种替代方法,您还可以使用In [11]: int('01111', 2) Out[11]: 15 函数:

operator.rshift()

了解详情:https://en.wikipedia.org/wiki/Arithmetic_shift

正如python wiki和@eryksun所指出的那样,您也可以考虑将右移操作划分为将30(左侧数字)除以2 1(右侧数字)将数字转换为2个幂的系数时,更容易理解。

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

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

答案 1 :(得分:3)

运算符>>是右移,在这种情况下是1.它大致等于整数除以2 ^ N,所以在这种情况下除以2 ^ 1(例如2)。所以:

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

其中N = 55 * 6 / 2等于15。

其中给出了基于一个增量向量的累积和,例如1:5