分为三部分的两种方法
方法一
0123456789->0369
13*3=39
5+4+4=13
//&:5 <<:4 |:4
#define puckThree(x){\
x &= 0x92492492;\
t1 = (x | (x << 2));\
x = t1 & 0xc30c30c3;\
t2 = (x | (x << 4));\
x = t2 & 0xf00f00f0;\
t3 = (x | (x << 8));\
x = t3 & 0xff0000ff;\
t4 = (x | (x << 16));\
x = t4 & 0xfff00000;\
}
方法二
可能出现的问题 因为32/6余2,32/12余8 ,所以会出现数据没有存储的地方,所以数据被冲掉。
代价:^ :3 >>:2 & :1 6*7=42
分为两部分方法:
01234567->02461357
4+8+12=24
//&:4 <<:8 ^:12
#define puck32(in)\
{\
temp1 = (in ^ (in >> 1)) & 0x22222222; in ^= temp1 ^ (temp1 << 1);\
temp1 = (in ^ (in >> 2)) & 0x0C0C0C0C; in ^= temp1 ^ (temp1 << 2);\
temp1 = (in ^ (in >> 4)) & 0x00F000F0; in ^= temp1 ^ (temp1 << 4);\
temp1 = (in ^ (in >> 8)) & 0x0000FF00; in ^= temp1 ^ (temp1 << 8);\
}