我试图通过使用'«'和'»'以及按位'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;
}
但结果完全不同。
答案 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]