forked from rampatra/Algorithms-and-Data-Structures-in-Java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReverseBits.java
91 lines (77 loc) · 2.46 KB
/
ReverseBits.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.rampatra.bits;
/**
* Created by IntelliJ IDEA.
*
* @author rampatra
* @since 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[] args) {
System.out.println(getNumberByReversingBits(79876));
System.out.println(getNumberByReversingBitsV1(79876));
System.out.println(getNumberByReversingBitsV2(79876));
System.out.println(getNumberByReversingBitsV2(5));
}
}