on writing a number as 2^s * q, where q is odd

Julieta Shem jshem at yaxenu.org
Sat Dec 2 21:33:26 EST 2023


Alan Bawden <alan at csail.mit.edu> writes:

> jak <nospam at please.ty> writes:
>
>    Alan Bawden ha scritto:
>    > Julieta Shem <jshem at yaxenu.org> writes:
>    >
>    >     How would you write this procedure?
>    >     def powers_of_2_in(n):
>    >         ...
>    >
>    > def powers_of_2_in(n):
>    >      return (n ^ (n - 1)).bit_count() - 1
>    >
>
>    Great solution, unfortunately the return value is not a tuple as in the
>    OP version. Maybe in this way?
>
>    def powers_of_2_inB(n):
>        bc = (n ^ (n - 1)).bit_count() - 1
>        return bc, int(n / (1 << bc))
>
> Good point.  I overlooked that.  I should have written:
>
> def powers_of_2_in(n):
>     bc = (n ^ (n - 1)).bit_count() - 1
>     return bc, n >> bc

That's pretty fancy and likely the fastest.  

I was pretty happy with a recursive version.  If I'm not mistaken,
nobody has offered a recursive version so far.  It's my favorite
actually because it seems to be the clearest one.

--8<---------------cut here---------------start------------->8---
def powers_of_2_in(n):
  if remainder(n, 2) != 0:
    return 0, n
  else:
    s, r = powers_of_2_in(n // 2)
    return 1 + s, r
--8<---------------cut here---------------end--------------->8---


More information about the Python-list mailing list