Write an Efficient C Program to Reverse Bits of a Number
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.
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.
/* 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, i, temp; for (i = 0; i < NO_OF_BITS; i++) { temp = (num & (1 << i)); if (temp) reverse_num |= (1 << ((NO_OF_BITS - 1) - i)); } return reverse_num; } /* Driver function to test above function */ int main() { unsigned int x = 2; printf ( "%u" , reverseBits(x)); getchar (); } |
Above program can be optimized by removing the use of variable temp. See below the modified code.
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; } |
Time Complexity: O(log n)
Space Complexity: O(1)
Space Complexity: 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.
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.
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; } int main() { unsigned int x = 1; printf ( "%u" , reverseBits(x)); getchar (); } |
Time Complexity: O(log n)
Space Complexity: O(1)
Space Complexity: O(1)
No comments:
Post a Comment