你能在'for-loop'中使用位移操作吗?

时间:2011-07-19 10:14:06

标签: python

我有以下C for循环使用位移,我想在python中重新实现。

n = 64
for(int stride = n>>1; stride >0; stride >>=1)
   {...

哇,这个循环会在python中看到吗?

我知道n>>1代表除以2,但我发现很难用range()对其进行建模。

8 个答案:

答案 0 :(得分:4)

想想更简单:

>>> n = 64
>>> while n:
...     print n
...     n = n >> 1
...
64
32
16
8
4
2
1

答案 1 :(得分:4)

Amadan's answer现场点亮。

如果你经常使用这个模式,我会把它提取到一个简单的生成器函数中,以便在for中重用 - 循环:

>>> def strider(n):
...     stride = n >> 1
...     while stride > 0:
...         yield stride
...         stride >>= 1
...
>>> for n in strider(64):
...     print n
...
32
16
8
4
2
1

答案 2 :(得分:2)

所有for(;;)循环都可以重写为while循环,反之亦然。

n = 64
stride = n >> 1
while stride > 0:
    # stuff
    stride >>= 1

已编辑以反映原始

的变化

答案 3 :(得分:1)

首先想到的是:

while stride>0:
   # do your stuff
   stride>>=1

在这种情况下,我认为尝试使用for循环并不是一个好主意。在Python中,for循环的工作方式与其他语言中的每个循环非常相似。他们按顺序行事。尽管我们可以轻松地将步幅的值范围转换为序列,但while恕我直言是表达这一想法的一种更简单,更自然的方式。

答案 4 :(得分:0)

您可以编写自己的generator以便在for循环中使用

答案 5 :(得分:0)

由于您没有多次迭代:

for stride in [32, 16, 8, 4, 2, 1, 0]:
  # ...

答案 6 :(得分:-1)

使用对数怎么样?

for i in range(int(math.log(n, 2)), -1, -1):
    # stride is 2**i

答案 7 :(得分:-2)

嗯,最接近的是使用itertools模块:

>>> from itertools import takewhile, imap, count
>>> n = 64
>>> for i in takewhile(bool, imap(lambda x:n >> x, count(1))):
...     print i
... 
32
16
8
4
2
1