练习 2-7。编写一个函数 invert(x,p,n),返回 x,其中从位置 p 开始的 n 位反转(即 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开始的。
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;
尽管如此,执行此操作没有意义,因为原始数字的低位会丢失
关于c - K&R C 反转功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34103176/