求教一个c语言函数invert(x,p,n)

awello 2010-06-30 11:21:47
函数invert(x, p, n)
返回对x做如下处理得到的值:x从第p位(右对齐的)开始的n位被求反(即:1变成0,0变成1),其余各位保持不变。

我是这样写的
unsigned invert(unsigned x,int p,int n)
{
return (x & ~((~(~0 << n)) << p) |((~x<<p) & (((~0 << n)) << p)) );
}
貌似没错误
但是结果是不对的,为什么?
后来看了一下网上的正确答案

unsigned invert(unsigned x,int p,int n)
{
return x ^ (((1 << n) - 1) << p);
}
这个确实是对的
但是第一个为什么错了?我先把n位取反,再其他位不变,或一下,不就可以了吗?
请教, 为什么我写的那个错了
...全文
701 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
awello 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lightboat09 的回复:]
引用楼主 awello 的回复:
函数invert(x, p, n)
返回对x做如下处理得到的值:x从第p位(右对齐的)开始的n位被求反(即:1变成0,0变成1),其余各位保持不变。

我是这样写的
....
但是第一个为什么错了?我先把n位取反,再其他位不变,或一下,不就可以了吗?
...

你如果做到了“把n位取反,其他位不变”,不就行了吗,你干嘛还要或一下呢?
还有就是你……
[/Quote]
return (x & ~((~(~0 << n)) << p) |((~x<<p) & (((~0 << n)) << p)) );

(x & ~((~(~0 << n)) << p) 这个是n位设置为0,其他位不变
((~x<<p) & (((~0 << n)) << p)) 这个写错了
应该是((~x<<p) & ((~(~0 << n)) << p)),表示n位取反,其他位为1
或一下就是 “把n位取反,其他位不变”的结果了,但是输出的结果不对,不知什么原因
小楫轻舟 2010-07-01
  • 打赏
  • 举报
回复
((~x<<p) & ((~(~0 << n)) << p))这个应该是:n位取反,其他位为0,
Arthur_ 2010-06-30
  • 打赏
  • 举报
回复
ddddd
小楫轻舟 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 awello 的回复:]
函数invert(x, p, n)
返回对x做如下处理得到的值:x从第p位(右对齐的)开始的n位被求反(即:1变成0,0变成1),其余各位保持不变。

我是这样写的
....
但是第一个为什么错了?我先把n位取反,再其他位不变,或一下,不就可以了吗?
...
[/Quote]
你如果做到了“把n位取反,其他位不变”,不就行了吗,你干嘛还要或一下呢?
还有就是你哪句做到了“先把n位取反,再其他位不变”?
((~x<<p) & (((~0 << n)) << p))是这句吗?没做到其他位不变啊!

15,445

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧