unsignedsrl(unsigned x, int k) { /* Perform shift arithmetically */ unsigned xsra = (int) x >> k; int w = sizeof(int) << 3; return xsra & ~(-2 << (w - k - 1)); }
intsra(int x, int k) { /* Perform shift logically */ int xsrl = (unsigned) x >> k; int w = sizeof(int) << 3; return xsrl - ((xsrl << 1) & (2 << (w - k - 1))); }
2.65
1 2 3 4 5 6 7 8 9 10
/* Return 1 when x contains an odd number of 1s; 0 otherwise. Assume w=32 */ intodd_ones(unsigned x) { x ^= x >> 16; x ^= x >> 8; x ^= x >> 4; x ^= x >> 2; x ^= x >> 1; return x & 1; }
2.66
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* * Generate mask indicating leftmost 1 in x. Assume w=32. * For example, 0xFF00 -> 0x8000, and 0x6600 --> 0x4000. * If x = 0, then return 0. */ intleftmost_one(unsigned x) { unsigned t = x; t >>= 1;
t |= t >> 1; t |= t >> 2; t |= t >> 4; t |= t >> 8; t |= t >> 16;
return (t + 1) & x; }
2.75
1 2 3 4
unsignedunsigned_high_prod(unsigned x, unsigned y) { int w = sizeof(int) << 3; return signed_high_prod(x, y) + (((int) y >> (w - 1)) & x) + (((int) x >> (w - 1)) & y); }
/* computs 0.5*f. If f is NaN, then return f. */ float_bits float_half(float_bits uf) { float_bits s = uf & 0x80000000, f = uf & 0x007FFFFF, e = (uf >> 23) & 0xFF;
if (e == 0xFF) { return uf; } if (e > 1) { e--; } else { if (e == 1) { f |= 1 << 23; e = 0; } int t = f; f >>= 1; if (t & f & 1) { f++; } } return s | (e << 23) | f; }