package me.ramswaroop.bits;
/**
* Created by IntelliJ IDEA.
*
* @author: ramswaroop
* @date: 6/5/15
* @time: 4:26 PM
* @link: http://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb-to-lsb-msb-in-c
* @link: http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious
*/
public class ReverseBits {
public static int getNumberByReversingBits(int n) {
int m;
// assume 32-bit number
m = 0x55555555; // 1-bit swap
n = ((n & m) << 1) | ((n & ~m) >>> 1);
m = 0x33333333; // 2-bits swap
n = ((n & m) << 2) | ((n & ~m) >>> 2);
m = 0x0f0f0f0f; // 4-bits swap
n = ((n & m) << 4) | ((n & ~m) >>> 4);
m = 0x00ff00ff; // 8-bits swap
n = ((n & m) << 8) | ((n & ~m) >>> 8);
n = (n << 16) | (n >>> 16); // 16-bits swap
return n;
}
/**
* Checks for set bits in {@param n} and sets them
* from the left end in {@code reverseNum}.
* <p/>
* Time Complexity: O(log n)
* Space Complexity: O(1)
*
* @param n
* @return
*/
public static int getNumberByReversingBitsV1(int n) {
int reverseNum = 0, i = 0;
while (n > 0) {
if ((n & 1) == 1) {
reverseNum |= 1 << 31 - i;
}
n >>>= 1;
i++;
}
return reverseNum;
}
/**
* This method is similar to {@link #getNumberByReversingBitsV1(int)} but here we put
* the set bits of {@param n} in {@code reverse number} and keep on shifting the reverse number
* left until {@param n} becomes {@code zero} and finally shift left for the remaining number of
* bits used to represent the number.
* <p/>
* Time complexity: O(log n) (as we are dividing 'n' by 2 in each iteration)
* Space Complexity: O(1)
*
* @param n
* @return
*/
public static int getNumberByReversingBitsV2(int n) {
int noOfBits = 32;
int reverse = 0;
while (n > 0) {
reverse <<= 1;
reverse |= n & 1;
n >>>= 1;
noOfBits--;
}
reverse <<= noOfBits;
return reverse;
}
public static void main(String a[]) {
System.out.println(getNumberByReversingBits(79876));
System.out.println(getNumberByReversingBitsV1(79876));
System.out.println(getNumberByReversingBitsV2(79876));
System.out.println(getNumberByReversingBitsV2(5));
}
}