问题描述
以下问题的答案是否正确?
我的解决方案是:
#include <stdio.h>
unsigned invert(unsigned x,int p,int n)
{
return (x >> (p + 1 - n)) ^ ~(~0 << n);
}
int main()
{
printf("%d\n",invert(6,4,3));
return 0;
}
打印输出 6
,0110
的二进制等价物。
解决方法
不,这是不正确的。
x >> (p+1-n)
会将原始数字的所有位移位,以便最高有效位不能保持不变。
我会使用类似以下内容
unsigned invert(unsigned x,int p,int n)
{
int const n_bits = sizeof(x) * CHAR_BIT;
assert(p >= 0 && p < n_bits);
assert(n >= 0 && n + p <= n_bits);
if ( n == 0 )
return x;
unsigned const mask = (~0u >> (n_bits - n)) << p;
return x ^ mask;
}