Checking if an Integer is an Exact Binary Power

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Mon Apr 25 05:56:27 PDT 2016


On 4/25/16 6:42 AM, Solomon E wrote:
> On Monday, 25 April 2016 at 05:35:12 UTC, Andrei Alexandrescu wrote:
>>
>> With gdc https://godbolt.org/g/jcU4np isPow2B is the winner (shortest
>> code, simplest instructions). -- Andrei
>
> I generalized function isPow2B to work for negative numbers in case of a
> signed type, while keeping the assembly the same or better. (That also
> incidentally made it correctly return false for zero.)
>
>> bool isPow2B(T)(T x)
>> {
>>    return (x & -x) > (x - 1);
>> }
>
> bool isPow2F(T)(T x)
> {
>      return (x & -x) > (x >>> 1);
> }
>
> assembly diff:
> --        subl    $1, %edi
> ++        shrl    %edi
>

That's smaller and faster, thanks. But how do you show it is still 
correct? -- Andrei


More information about the Digitalmars-d mailing list