# Simple Recursive Generator Question

Bengt Richter bokr at oz.net
Fri Dec 19 23:02:19 CET 2003

```On 19 Dec 2003 11:13:39 -0800, jcb at iteris.com (MetalOne) wrote:

>I am trying to write a generator function that yields the index position
>of each set bit in a mask.
>e.g.
>for x in bitIndexGenerator(0x16): #10110
>    print x
>--> 1 2 4
>
>
>This is what I have, but it does not work.
>Changing yield to print, shows that the recursion works correctly.
>
>    if mask == 0: return
>    elif mask & 0x1: yield index
>
>What am I missing?

Here is one that works also for negative numbers (includes the least significant
of the arbitrarily extended sign bits):

>>> def bitnos(self):
...     """Little-endian bit number generator"""
...     bits = long(self)
...     sign = bits<0
...     bitno = 0
...     while bits>0 or sign and bits!=-1L:
...         if bits&1: yield bitno
...         bitno += 1
...         bits >>= 1
...     if sign: yield bitno
...

(I'll use a subclass of long I recently posted (with missing ~ operator in first version, but
fix followup posted) to show bits) The above is a mod of the bit list generator from the latter.

>>> from lbits import LBits
>>>
>>> for i in range(-3,4)+[0x16, -0x16]:
...     print '%3s %8r %s' %(i, LBits(i), [bit for bit in bitnos(i)])
...
-3     101b [0, 2]
-2     110b [1]
-1      11b [0]
0       0b []
1      01b [0]
2     010b [1]
3     011b [0, 1]
22  010110b [1, 2, 4]
-22  101010b [1, 3, 5]

Regards,
Bengt Richter

```