K& R C反转功能

时间:2015-12-05 09:10:49

标签: c bit-manipulation bit bitmask operations

练习2-7。写一个函数invert(x,p,n),它返回x,其中n位从位置p开始反转(即1变为0,反之亦然),其他不变。

#include <cstdio>

int invert(unsigned int x, int p, int n)
{
    int inverted_x = ~x;
    //gets rid of bits before position p
    inverted_x = inverted_x << (p - 1);
    inverted_x = inverted_x >> (p - 1);

    //gets rids of bits after position p+n
    inverted_x = inverted_x >> ((sizeof(x) * 8) - (p + n));
    inverted_x = inverted_x << ((sizeof(x) * 8) - (p + n));
    return inverted_x;

}

int main()
{
    int a = 123;
    printf("%d \n", invert(a, 2, 3));
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在我看来,以下列方式编写函数要简单得多。 我认为该职位从0开始。

int invert( int x, int p, int n )
{
    unsigned int mask = ~( ~0 << n ) << p;

    return x ^ mask;;
}    

至于你的功能,至少这些陈述

//gets rid of bits before position p
inverted_x = inverted_x << (p - 1);
inverted_x = inverted_x >> (p - 1);

已经错了。他们不按你的想法行事。

编写

是正确的
//gets rid of bits before position p
inverted_x = inverted_x >> p;
inverted_x = inverted_x << p;

然而,执行此操作没有意义,因为原始数字的低位丢失