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

4
我将尝试使用 '«' 和 '»' 以及位运算符 'AND' 和 'OR' (& 和 |) 来反转无符号整数,但我还不知道如何实现。
以下是我已经完成的内容;
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
展示实际反转字符串的代码。 - G one
@Gone 你是指整数吗? - nitish712
@nitish712:是啊,没错 :) - G one
1
一个 int 类型有四个字节需要被反转,因此不要反转位。 - Hans Passant
1
这是你要找的吗?:https://dev59.com/TnI95IYBdhLWcg3wtwf4 - qwark
显示剩余7条评论
2个回答

3

试试这个:

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 */

谢谢,你的代码起作用了,但我不认为这是反转字节的正确方式。无论如何,还是谢谢。 - MOTIVECODEX
@F4LLCON 这个解决方案仅适用于4字节整数,您也可以扩展它以支持其他整数,据我所知,这个解决方案是正确的,并且没有问题。 - frogatto
1
这可能违反别名规则,并且可能无法正常工作。使用简单的位移是最好的。 - phuclv

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位块),并使用按位或运算符将其合并到另一个方向的结果中。

它说半字节(nibble)没有分配? - MOTIVECODEX
谢谢您,但是我无法使用我原有的代码使其工作,但是ABFORCE提供的另一个答案起了作用,尽管这似乎不是正确的方法。 - MOTIVECODEX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接