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

jak nospam at please.ty
Sat Dec 2 23:21:56 EST 2023


Julieta Shem ha scritto:
> 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---
> 

for n = 0 your function get stack overflow


More information about the Python-list mailing list