【问题标题】:How to reverse the 4 bytes of an unsigned integer? [duplicate]如何反转无符号整数的 4 个字节? [复制]
【发布时间】:2014-03-27 13:47:51
【问题描述】:

我正在尝试使用“«”和“»”以及按位“与”和“或”(& 和 |)来反转无符号整数,但不知道如何做到这一点。

我已经拥有的;

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

但结果完全不同。

【问题讨论】:

  • 显示实际反转字符串的代码。
  • @Gone 你的意思是整数?
  • @nitish712: 是的仪式:)
  • 一个int中有4个字节需要反转。所以不要颠倒这些位。
  • 这是您要找的吗?:stackoverflow.com/questions/2182002/…

标签: c int unsigned


【解决方案1】:

试试这个:

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

【讨论】:

  • 谢谢,您的代码有效,但我真的不认为这是反转字节的正确方法?.. 无论如何谢谢
  • @F4LLCON 此解决方案仅适用于 4 字节整数,您也可以扩展它以支持其他整数,据我所知,此解决方案是正确的,没有问题
  • 这可能违反别名规则,并且可能无法正常工作。使用简单的位移是最好的
【解决方案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未分配?
  • 谢谢,但我无法使用我拥有的代码使其工作,但 ABFORCE 的另一个答案有效,但它似乎不是正确的方法..
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2011-04-06
  • 2011-08-09
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多