转自:https://blog.csdn.net/wuxianglonghaohao/article/details/21602305
http://www.newhottopic.com/2014/03/20/reverse-bits/
提示:
异或交换的小技巧:
- typedef unsigned int uint;
- uint swapBits(uint x, uint i, uint j) {
- uint lo = ((x >> i) & 1);
- uint hi = ((x >> j) & 1);
- if (lo ^ hi) {
- x ^= ((1U << i) | (1U << j));
- }
- return x;
- }
- uint reverseXor(uint x) {
- uint n = sizeof(x) * 8;
- for (uint i = 0; i < n/2; i++) {
- x = swapBits(x, i, n-i-1);
- }
- return x;
- }
(译者注:上面的其中一行代码:x ^= ((1U < < i) | (1U << j));是为了切换两个位置的bit值,可以看个例子:x = 1001,–> x ^= ((1U < < 1) | (1U << 3)) –> x = 1001 ^ (1010) –> x = 0011 )
分而治之:
- 01101001
- / \
- 0110 1001
- / \ / \
- 01 10 10 01
- /\ /\ /\ /\
- 0 1 1 0 1 0 0 1
- uint reverseMask(uint x) {
- assert(sizeof(x) == 4); // special case: only works for 4 bytes (32 bits).
- x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1);
- x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2);
- x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4);
- x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8);
- x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16);
- return x;
- }