如何解决写一个 func invert(x,p,n) 返回 x,其中从位置 p 开始的 n 位被反转1 变为 0,反之亦然,其他保持不变
以下问题的答案是否正确?
我的解决方案是:
#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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。