练习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));
}
我做错了什么?
答案 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;
然而,执行此操作没有意义,因为原始数字的低位丢失