>> Also note that '(b & ((u64)1 << 63)) ? 0x87 : 0x00;' is actually getting >> compiled as '((s64)b >> 63) & 0x87', which is branchless and therefore makes the >> new version more efficient than one might expect: >> >> sar $0x3f,%rax >> and $0x87,%eax >> >> It could even be written the branchless way explicitly, but it shouldn't matter. > > I think the definition using unsigned operations is more intuitive... > Let's just leave the clever tricks up to the compiler :) It may be a good idea to use the one that provides constant time-ness to help avoid leaking information. Jeff