How to reverse the 4 bytes of an unsigned integer?

11,425

Solution 1

Try this:

int getal;     // original number
int reversed;  // 4 bytes reversed of getal

/* get number form console here */

uint8_t *n1, *n2;
n1 = (uint8_t *) &getal;
n2 = (uint8_t *) &reversed;

n2[0] = n1[3];
n2[1] = n1[2];
n2[2] = n1[1]; 
n2[3] = n1[0];

/* print reversed here */

Solution 2

Your code seems like it's trying to reverse the bits, but your indicated desired outcome is a reversal of the 8-bit groups that make up each pair of hexadecimal digits. These are not the same.

You need something like:

unsigned int reverse_nibbles(unsigned int x)
{
  unsigned int out = 0, i;
  for(i = 0; i < 4; ++i)
  {
    const unsigned int byte = (x >> 8 * i) & 0xff;
    out |= byte << (24 - 8 * i);
  }
  return out;
}

The above (untested) code assumes unsigned int is 32 bits; generalizing it is trivial but I left it out for simplicity's sake.

It simply extracts one byte (8-bit chunk) at a time from one direction, and uses bitwise or to merge it into the result from the other direction.

Share:
11,425

Related videos on Youtube

MOTIVECODEX
Author by

MOTIVECODEX

Updated on June 06, 2022

Comments

  • MOTIVECODEX
    MOTIVECODEX almost 2 years

    I am trying to reverse the unsigned integer by using the '«' and '»', and bitwise 'AND' and 'OR' (& and |), but can't figure out how to do this.

    What I already have;

    int main(int argc, char** argv) {
        unsigned int getal;
        scanf("%i", &getal);
        printf("%X\n", getal);
        return 0;
    }
    

    User input: 0xaabbccdd, output now: AABBCCDD, what it should output DDCCBBAA

    I also tried;

    int main(int argc, char** argv) {
        unsigned int getal;
        unsigned int x;
        scanf("%i", &getal);
        int i;
        for (i = 0; i < 32; ++i) {
            getal <<= 1;
            getal |= (x & 1);
            x >>= 1;
            printf("%X\n", getal);
        }
        return 0;
    }
    

    but the result was completely different.

    • user1703401
      user1703401 over 10 years
      There are 4 bytes in an int that need to be reversed. So don't reverse the bits.
    • qwark
      qwark over 10 years
      Is this what you looking for ?: stackoverflow.com/questions/2182002/…
    • G one
      G one
      Show the code which actually reverses the string.
  • MOTIVECODEX
    MOTIVECODEX over 10 years
    It says that nibble is unassigned?
  • MOTIVECODEX
    MOTIVECODEX over 10 years
    Thank you, but I could not get it working with the code I had, but the other answer from ABFORCE worked, tho it does not seem to be a correct way to do..