Reverse bits using lookup table in O(1) time
Last Updated :
17 Mar, 2023
Given an unsigned integer, reverse all bits of it and return the number with reversed bits. Examples:
Input : n = 1
Output : 2147483648
On a machine with size of unsigned
bit as 32. Reverse of 0....001 is
100....0.
Input : n = 2147483648
Output : 1
In the previous post we had seen two method that solved this problem in O(n) & O(logn ) time. Here we solve this problem in O(1) time using lookup table. It's hard to reverse all 32 bits (assuming this as size of int) in one go using lookup table (" because it's infeasible to create lookup table of size 232-1 "). So we break 32 bits into 8 bits of chunks( lookup table of size 28-1 "0-255"). Lookup Table in lookup tale we will store reverse of every number that are in a range( 0-255) LookupTable[0] = 0 | binary 00000000 Reverse 00000000 LookupTable[1] = 128 | binary 00000001 reverse 10000000 LookupTable[2] = 64 | binary 00000010 reverse 01000000 LookupTable[3] = 192 | binary 00000011 reverse 11000000 LookupTable[4] = 32 | binary 00000100 reverse 00100000 and so on... upto lookuptable[255]. Let's take an Example How lookup table work. let number = 12456 in Binary = 00000000000000000011000010101000
Split it into 8 bits chunks : 00000000 | 00000000 | 00110000 | 10101000
in decimal : 0 0 48 168
reverse each chunks using lookup table :
Lookuptable[ 0 ] = 0 | in binary 00000000
Lookuptable[48 ] = 12 | in binary 00001100
Lookuptable[168] = 21 | in binary 00010101
Now Binary :
00000000 | 00000000 | 00001100 | 00010101
Binary chunks after rearrangement :
00010101 | 00001100 | 00000000 | 00000000
Reverse of 12456 is 353107968
CPP
// CPP program to reverse bits using lookup table.
#include <bits/stdc++.h>
using namespace std;
// Generate a lookup table for 32bit operating system
// using macro
#define R2(n) n, n + 2 * 64, n + 1 * 64, n + 3 * 64
#define R4(n) \
R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)
#define R6(n) \
R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)
// Lookup table that store the reverse of each table
unsigned int lookuptable[256]
= { R6(0), R6(2), R6(1), R6(3) };
/* Function to reverse bits of num */
int reverseBits(unsigned int num)
{
int reverse_num = 0; // Reverse and then rearrange
// first chunk of 8 bits from right
reverse_num = lookuptable[num & 0xff] << 24 |
// second chunk of 8 bits from right
lookuptable[(num >> 8) & 0xff] << 16
| lookuptable[(num >> 16) & 0xff] << 8
| lookuptable[(num >> 24) & 0xff];
return reverse_num;
} // driver program to test above function
int main()
{
int x = 12456;
printf("%u", reverseBits(x));
return 0;
}
Java
// Java program to reverse bits using lookup table.
import java.util.*;
class GFG {
// Lookup table that store the reverse of each table
public static ArrayList<Integer> lookuptable
= new ArrayList<Integer>();
// Generate a lookup table for 32bit operating system
// using macro
public static void R2(int n)
{
lookuptable.add(n);
lookuptable.add(n + 2 * 64);
lookuptable.add(n + 1 * 64);
lookuptable.add(n + 3 * 64);
}
public static void R4(int n)
{
R2(n);
R2(n + 2 * 16);
R2(n + 1 * 16);
R2(n + 3 * 16);
}
public static void R6(int n)
{
R4(n);
R4(n + 2 * 4);
R4(n + 1 * 4);
R4(n + 3 * 4);
}
// Function to reverse bits of num
public static int reverseBits(int num)
{
int reverse_num = 0;
// Reverse and then rearrange
// first chunk of 8 bits from right
reverse_num
= lookuptable.get(num & 0xff) << 24 |
// second chunk of 8 bits from right
lookuptable.get((num >> 8) & 0xff) << 16
| lookuptable.get((num >> 16) & 0xff) << 8
| lookuptable.get((num >> 24) & 0xff);
return reverse_num;
}
// Driver code
public static void main(String[] args)
{
R6(0);
R6(2);
R6(1);
R6(3);
// Driver program to test above function
int x = 12456;
System.out.println(reverseBits(x));
}
}
// This code is contributed by phasing17
Python3
#Python3 program to reverse bits using lookup table.
# Lookup table that store the reverse of each table
lookuptable = []
# Generate a lookup table for 32bit operating system
# using macro
def R2(n):
return lookuptable.extend([n, n + 2*64, n + 1*64, n + 3*64])
def R4(n):
return R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16)
def R6(n):
return R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 )
lookuptable.extend([R6(0), R6(2), R6(1), R6(3)])
# Function to reverse bits of num
def reverseBits(num):
reverse_num = 0
# Reverse and then rearrange
# first chunk of 8 bits from right
reverse_num = lookuptable[num & 0xff ]<<24 | lookuptable[ (num >> 8) & 0xff ]<<16 |lookuptable[ (num >> 16 )& 0xff ]<< 8 | lookuptable[ (num >>24 ) & 0xff ]
return reverse_num
# Driver program to test above function
x = 12456
print(reverseBits(x))
#This code is contributed by phasing17
JavaScript
// JavaScript program to reverse bits using lookup table.
// Lookup table that stores the reverse of each table.
let lookuptable = [];
// Generate a lookup table for 32-bit operating system using macro.
function R2(n) {
return lookuptable.push(n, n + 2 * 64, n + 1 * 64, n + 3 * 64);
}
function R4(n) {
return [R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)];
}
function R6(n) {
return [R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)];
}
lookuptable.push(R6(0), R6(2), R6(1), R6(3));
// Function to reverse bits of num.
function reverseBits(num) {
let reverse_num = 0;
// Reverse and then rearrange.
// First chunk of 8 bits from right.
reverse_num =
lookuptable[num & 0xff] << 24 |
lookuptable[(num >> 8) & 0xff] << 16 |
lookuptable[(num >> 16) & 0xff] << 8 |
lookuptable[(num >> 24) & 0xff];
return reverse_num;
}
// Driver program to test above function.
let x = 12456;
console.log(reverseBits(x));
C#
// C# program to reverse bits using lookup table.
using System;
using System.Collections.Generic;
class GFG {
// Lookup table that store the reverse of each table
public static List<int> lookuptable = new List<int>();
// Generate a lookup table for 32bit operating system
// using macro
public static void R2(int n)
{
lookuptable.Add(n);
lookuptable.Add(n + 2 * 64);
lookuptable.Add(n + 1 * 64);
lookuptable.Add(n + 3 * 64);
}
public static void R4(int n)
{
R2(n);
R2(n + 2 * 16);
R2(n + 1 * 16);
R2(n + 3 * 16);
}
public static void R6(int n)
{
R4(n);
R4(n + 2 * 4);
R4(n + 1 * 4);
R4(n + 3 * 4);
}
// Function to reverse bits of num
public static int reverseBits(int num)
{
int reverse_num = 0;
// Reverse and then rearrange
// first chunk of 8 bits from right
reverse_num = lookuptable[num & 0xff] << 24 |
// second chunk of 8 bits from right
lookuptable[(num >> 8) & 0xff] << 16
| lookuptable[(num >> 16) & 0xff] << 8
| lookuptable[(num >> 24) & 0xff];
return reverse_num;
}
// Driver code
public static void Main(string[] args)
{
R6(0);
R6(2);
R6(1);
R6(3);
int x = 12456;
// Function call
Console.WriteLine(reverseBits(x));
}
}
// This code is contributed by phasing17
Output:
353107968
Time Complexity: O(1)
Auxiliary Space: O(1)
Similar Reads
Count set bits in an integer using Lookup Table Write an efficient program to count number of 1s in binary representation of an integer.Examples: Input : n = 6Output : 2Binary representation of 6 is 110 and has 2 set bitsInput : n = 13Output : 3Binary representation of 13 is 1101 and has 3 set bits In the previous post we had seen different metho
6 min read
Count trailing zero bits using lookup table Given an integer, count the number of trailing zeroes. For example, for n = 12, its binary representation is 1100 and number of trailing zero bits is 2. Examples : Input : 8 Output : 3 Binary of 8 is 1000, so there are three trailing zero bits. Input : 18 Output : 1 Binary of 18 is 10010, so there i
7 min read
Compute the parity of a number using XOR and table look-up Parity of a number refers to whether it contains an odd or even number of 1-bits. The number has âodd parityâ, if it contains odd number of 1-bits and is âeven parityâ if it contains even number of 1-bits. 1 --> parity of the set is odd 0 --> parity of the set is even Examples: Input : 254 Out
9 min read
Reverse a sublist of linked list Given a linked list and positions m and n. We need to reverse the linked list from position m to n.Examples: Input : linkedlist : 10->20->30->40->50->60->70->NULL , m = 3 and n = 6Output : 10->20->60->50->40->30->70->NULLExplanation: Linkedlist reversed star
15+ min read
Range maximum query using Sparse Table Given an array arr[], the task is to answer queries to find the maximum of all the elements in the index range arr[L...R].Examples: Input: arr[] = {6, 7, 4, 5, 1, 3}, q[][] = {{0, 5}, {3, 5}, {2, 4}} Output: 7 5 5 Input: arr[] = {3, 34, 1}, q[][] = {{1, 2}} Output: 34 Approach: A similar problem to
9 min read