使用二进制数反转功能

时间:2014-05-08 12:44:26

标签: c operators logic bit-manipulation bits

写一个函数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;
}

1 个答案:

答案 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函数测试它,结果是正确的,但它们的二进制表示不是。主函数中十进制和​​二进制之间的转换一定有问题。