Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reverse the 4 bytes of an unsigned integer? [duplicate]

Tags:

c

int

unsigned

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.

like image 944
MOTIVECODEX Avatar asked Sep 03 '25 04:09

MOTIVECODEX


2 Answers

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 */
like image 84
frogatto Avatar answered Sep 04 '25 19:09

frogatto


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.

like image 37
unwind Avatar answered Sep 04 '25 19:09

unwind