写一个函数invert(x,p,n),它返回x,其中n位从位置p反转开始。下面的代码是从末尾反转数字,但我需要将此代码更改为从头开始反转,我不知道如何。我真的不懂逻辑运算符等等。
函数invert()
应该返回:
x = 123 (1111011)
invert[x, 1, 2]
x: 75 (1001011)
但它正在归还:
x = 123 (1111011)
invert[x, 1, 2]
x: 120 (1111000)
当前代码:
unsigned int invert(unsigned int x, int p, int n)
{
return x ^ ((~(~0<<n))<< (p-n));
}
int main()
{
int i, j, x, ii, nn;
scanf("%d %d %d", &x, &ii, &nn);
printf("x = %d ", x);
printf("(");
for (j = 0, i = 31; i >= 0; i--)
{
if (x & (1<<i))
j = 1;
if (j)
{
if (x & (1<<i))
printf("1");
else
printf("0");
}
}
printf(")\n");
printf("invert(x, %d, %d)\n", ii, nn);
x = invert(x, ii, nn);
printf("x: %d ", x);
printf("(");
for (j = 0, i = 31; i >= 0; i--)
{
if (x & (1<<i))
j = 1;
if (j)
{
if (x & (1<<i))
printf("1");
else
printf("0");
}
}
printf(")\n");
return 0;
}
答案 0 :(得分:0)
试试这段代码:
#define BITS_IN_A_BYTE 8
unsigned int invert(unsigned int x, int p, int n)
{
int i;
unsigned int mask = 1;
/* Puts at the end of mask as many 1s as indicated by n. */
for (i = 1; i != n; i++) {
mask = (mask << 1) + 1;
}
/* Moves the 1s to the position indicated by p. */
mask = mask << ((BITS_IN_A_BYTE * sizeof(unsigned int) - p - n));
return x ^ mask;
}
如果(因为它看起来像你的例子),最高位被认为是位置0,这将起作用。如果你想把它当作位置1,就这样写:
mask = mask << ((BITS_IN_A_BYTE * sizeof(unsigned int) - p - n + 1));
此外,此代码不可移植(它仅适用于字节由8位组成的体系结构),并且不检查错误(例如,如果指定的位置高于unsigned int dimension)。
还有一件事:用你的main函数测试它,结果是正确的,但它们的二进制表示不是。主函数中十进制和二进制之间的转换一定有问题。