Simple features that I've always missed from C...

Walter Bright newshound2 at digitalmars.com
Mon Oct 17 22:24:53 PDT 2011


On 10/17/2011 4:45 PM, bearophile wrote:
> Manu:
>
>> *Roll/Rotate:* I'm loving the '>>>' operator, but I could often really do
>> with a rotate operator useful in many situations... '>>|' perhaps...
>> something like that? This is ugly: a = (a<<  x) | ((unsigned)a>>
>> (sizeof(a)/8 - x));
>
> I have asked for a rotate intrinsic in Phobos, but Walter has added a rewrite
> rule instead, that turns D code to a rot. Personal experience has shown me
> that it's easy to write the operation in a slightly different way (like with
> signed instead of unsigned values) that causes a missed optimization. So I
> prefer still something specific, like a Phobos intrinsic, to explicitly ask
> for this operation to every present and future D compiler, with no risk of
> mistakes.

There's no need for a compiler intrinsic. Just write a function that does do the 
optimization, and call it.

The signed versions "don't work" because a signed right shift is not the same 
thing as an unsigned right shift.

For reference:

void test236()
{
     uint a;
     int shift;
     a = 7;
     shift = 1;
     int r;
     r = (a >> shift) | (a << (int.sizeof * 8 - shift));
     assert(r == 0x8000_0003);
     r = (a << shift) | (a >> (int.sizeof * 8 - shift));
     assert(a == 7);
}


More information about the Digitalmars-d mailing list