# Write an Efficient C Program to Reverse Bits of a Number

Given an unsigned integer, reverse all bits of it and return the number with reversed bits.

Input :n = 1Output :2147483648Explanation :On a machine with size of unsigned bit as 32. Reverse of 0….001 is 100….0.

Input : n= 2147483648Output :1

**Method1 – Simple: **Loop through all the bits of an integer. If a bit at ith position is set in the i/p no. then set the bit at **(NO_OF_BITS – 1) – i** in o/p. Where **NO_OF_BITS** is number of bits present in the given number.

Below is the implementation of the above approach:

## c

`// C code to implement the approach` `#include <stdio.h>` `// Function to reverse bits of num` `unsigned ` `int` `reverseBits(unsigned ` `int` `num)` `{` ` ` `unsigned ` `int` `NO_OF_BITS = ` `sizeof` `(num) * 8;` ` ` `unsigned ` `int` `reverse_num = 0;` ` ` `int` `i;` ` ` `for` `(i = 0; i < NO_OF_BITS; i++) {` ` ` `if` `((num & (1 << i)))` ` ` `reverse_num |= 1 << ((NO_OF_BITS - 1) - i);` ` ` `}` ` ` `return` `reverse_num;` `}` `// Driver code` `int` `main()` `{` ` ` `unsigned ` `int` `x = 2;` ` ` `printf` `(` `"%u"` `, reverseBits(x));` ` ` `getchar` `();` `}` |

**Output**

1073741824

**Time Complexity:** O(1)**Auxiliary space: **O(1)

**Method 2 – Standard:** The idea is to keep putting **set bits** of the num in **reverse_num** until num becomes zero. After num becomes **zero**, shift the remaining bits of **reverse_num**. Let num is stored using** 8 bits** and num be** 00000110**. After the loop you will get **reverse_num as 00000011**. Now you need to **left shift reverse_num** **5 more times** and you get the exact **reverse** **01100000.**

Below is the implementation of the above approach:

## c

`// C code to implement the approach` `#include <stdio.h>` `// Function to reverse bits of num` `unsigned ` `int` `reverseBits(unsigned ` `int` `num)` `{` ` ` `unsigned ` `int` `count = ` `sizeof` `(num) * 8 - 1;` ` ` `unsigned ` `int` `reverse_num = num;` ` ` `num >>= 1;` ` ` `while` `(num) {` ` ` `reverse_num <<= 1;` ` ` `reverse_num |= num & 1;` ` ` `num >>= 1;` ` ` `count--;` ` ` `}` ` ` `reverse_num <<= count;` ` ` `return` `reverse_num;` `}` `// Driver's code` `int` `main()` `{` ` ` `unsigned ` `int` `x = 1;` ` ` `printf` `(` `"%u"` `, reverseBits(x));` ` ` `getchar` `();` `}` |

**Output**

2147483648

**Time Complexity:** O(1)**Auxiliary space: **O(1)

**Method 3 – Lookup Table:** We can reverse the bits of a number in O(1) if we know the size of the number. We can implement it using look up table. Please refer Reverse bits using lookup table in O(1) time for details.

**Source : **https://graphics.stanford.edu/~seander/bithacks.html