原串:10010001111011010101011001110101
输出:10101110011010101011011110001001
也就是,最后一位变成了第一位,第一位变成了最后一位。
如果固定为32位,用如下函数解决(gxqcn提供)
reverse(
uint
x)
... {
uint y = 0x55555555;
x = (((x > > 1) & y) ¦ ((x & y) < < 1));
y = 0x33333333;
x = (((x > > 2) & y) ¦ ((x & y) < < 2));
y = 0x0f0f0f0f;
x = (((x > > 4) & y) ¦ ((x & y) < < 4));
y = 0x00ff00ff;
x = (((x > > 8) & y) ¦ ((x & y) < < 8));
return((x > > 16) ¦ (x < < 16));
}
... {
uint y = 0x55555555;
x = (((x > > 1) & y) ¦ ((x & y) < < 1));
y = 0x33333333;
x = (((x > > 2) & y) ¦ ((x & y) < < 2));
y = 0x0f0f0f0f;
x = (((x > > 4) & y) ¦ ((x & y) < < 4));
y = 0x00ff00ff;
x = (((x > > 8) & y) ¦ ((x & y) < < 8));
return((x > > 16) ¦ (x < < 16));
}
这里,一共进行了5次置换。
原串:12345678...32
第一次:2 1 4 3 6 5 8 7 ... 32 31
第二次:4 3 2 1 8 7 6 5 ... 32 31 30 29
第三次:8 7 6 5 4 3 2 1 ... 32 31 30 29 28 27 26 25
到了第五次,置换完成。