A 32 bit number is a series of bits from 0 to 31. We can access each bit via shifting operation. We take an unit 1 as reference min value to traverse bits. When we shift 1 by 0 at right, it positioned at 0th position and if we AND it with bits it gives 0th position value. ANDing with 1 gives us the exact value. If the bit is 1 then we get 1 else 0 will result as 0 only. Now we shift to next position i.e. shift right by 1 and AND with bits. This way we can iterate till 31th bit and obtain each bits.

Previous steps shows how to access each bit and how to iterate through bits. Now reversing neighbour bits are more complex. We need to get bit 0 and bit 1 and swap it and save it again back to bitmask. In the next iteration we access 1 and 2 th bit and swap. In this way we swap two bits till highest position. This is the way to swap 2 bits using a loop.

There is another way to swap bits without a loop. We take a bit mask with all even positions on (0x55). Now AND it with bits. This will get all even bits and shift it to next left. Again take a bit mask where all odd bits are on. AND it to mask will produce a mask of all odd bits. Now shift the bits to next right. Now finally or this two bit patters to get the result bits.


#include <stdio.h>
#ifdef USING_LOOP
unsigned int swap_2bits(unsigned int bits)
{
  int i;
  unsigned int ml, mh;
  for (= 0; i < 32; i += 2) {
    /* Get bit lower */
    ml = (bits & (<< i));
    /* Get bit higher */
    mh = (bits & (<< (i + 1)));
    /* Move lower to higher */
    ml <<= 1;
    /* Move higher to lower */
    mh >>= 1;
    /* reset two bits */
    bits &= ~(0x3 << i);
    /* copy two swapped bits back to bits */
    bits |= (mh | ml);
  }
  return bits;
}
#else
unsigned int swap_2bits(unsigned int bits)
{
  unsigned int mask = 0x55555555;
  bits = ((bits & mask) << 1) | ((bits & ~mask) >> 1);
  return bits;
}
#endif
void print_bits(unsigned int bits, int size)
{
  int i;
  char output[33];
  memset(output, 0, sizeof(output));
  for(= size-1; i >= 0; i--)
  {
    output[size-i-1] = (bits & (<<i))? '1' : '0';
  }
  printf(output);
}
int main(int argc, char* argv[])
{
  unsigned int  bits;
  bits = 0x12345678;
  printf("Original Bits\n");
  print_bits(bits, 32);
  printf("\nReversed Bits\n");
  bits = swap_2bits(bits);
  print_bits(bits, 32);
}  

Output
Original Bits
00010010001101000101011001111000
Reversed Bits
00100001001110001010100110110100

About our authors: Team EQA

You have viewed 1 page out of 252. Your C learning is 0.00% complete. Login to check your learning progress.

#