如何反转无符号整数的4个字节?

时间:2014-02-25 11:14:52

标签: c int unsigned

我试图通过使用'«'和'»'以及按位'AND'和'OR'(&amp;和|)来反转无符号整数,但是无法弄清楚如何执行此操作。< / p>

我已经拥有的东西;

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

用户输入:0xaabbccdd,现在输出:AABBCCDD,输出什么DDCCBBAA

我也试过了;

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;
}

但结果完全不同。

2 个答案:

答案 0 :(得分:2)

您的代码似乎正在尝试反转,但您指示的期望结果是构成每对十六进制数字的8位组的反转。这些都不一样。

您需要以下内容:

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;
}

上述(未经测试)代码假定unsigned int为32位;概括它是微不足道的,但为了简单起见我把它留了出来。

它只是从一个方向一次提取一个字节(8位块),并使用按位或将其合并到另一个方向的结果中。

答案 1 :(得分:2)

试试这个:

int getal;     // this is regular integer number
int reversed;  // this is reverse of getal

/* get number form console here */

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

*(n2 + 0) =  *(n1 + 3);  // or n2[0] = n1[3];
*(n2 + 1) =  *(n1 + 2);  // or n2[1] = n1[2];
*(n2 + 2) =  *(n1 + 1);  // or n2[2] = n1[1]; 
*(n2 + 3) =  *(n1 + 0);  // or n2[3] = n1[0];

/* print reversed here */

注意:*(a + b) = a[b] = b[a]