Monday, August 18, 2014

Find position of most significant bit, and log2


typedef uint32_t t4u;
typedef uint64_t t8u;

static t4u wsLog2(t4u p)noexcept{static t4u const n[0x20]={
0x00,0x09,0x01,0x0A,0x0D,0x15,0x02,0x1D,0x0B,0x0E,0x10,0x12,0x16,0x19,0x03,0x1E,
0x08,0x0C,0x14,0x1C,0x0F,0x11,0x18,0x07,0x13,0x1B,0x17,0x06,0x1A,0x05,0x04,0x1F};
p|=p>>0x01,p|=p>>0x02,p|=p>>0x04,p|=p>>0x08,p|=p>>0x10;return n[(p*0x07C4ACDDU)>>0x1B];}
static t4u wsLog2(t8u p)noexcept{static t4u const n[0x40]={
0x00,0x01,0x02,0x07,0x03,0x0D,0x08,0x13,0x04,0x19,0x0E,0x1C,0x09,0x22,0x14,0x28,
0x05,0x11,0x1A,0x26,0x0F,0x2E,0x1D,0x30,0x0A,0x1F,0x23,0x36,0x15,0x32,0x29,0x39,
0x3F,0x06,0x0C,0x12,0x18,0x1B,0x21,0x27,0x10,0x25,0x2D,0x2F,0x1E,0x35,0x31,0x38,
0x3E,0x0B,0x17,0x20,0x24,0x2C,0x34,0x37,0x3D,0x16,0x2B,0x33,0x3C,0x2A,0x3B,0x3A};
p|=p>>0x01,p|=p>>0x02,p|=p>>0x04,p|=p>>0x08,p|=p>>0x10,p|=p>>0x20;
return n[((p>>0x01)+0x01)*0x218A392CD3D5DBF>>0x3A];}

No comments:

Post a Comment