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