首页 新闻 赞助 找找看

关于循环右移

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-12 15:46

写一个循环右移C函数

我的代码是

unsigned rotate_right(unsigned x, int n)
{
unsigned right = x >> n;
unsigned left = x << ((sizeof(unsigned) << 3) - n);

return left | right;
}

答案是这个样子的:(深入理解计算机系统的官方配套答案,感觉大师写的应该有他的道理吧,可自己能力有限实在不懂,求高人指教)

unsigned rotate_right(unsigned x, int n)
{

/*mask all 1's when n = 0 and all 0's otherwise*/
int z_mask = -!n;
unsigned right = x >> n;
unsigned left = x << ((sizeof(unsigned) << 3) - n);

return (z_mask & x) | (~z_mask & (left | right));
}

谁能告诉我这个答案有什么好处吗? 或者我的有什么缺陷吗? 我自己感觉我写的足够了啊。 求高人指教。

Terry Zhang的主页 Terry Zhang | 初学一级 | 园豆:179
提问于:2013-10-05 11:01
< >
分享
最佳答案
0

n等于0时,left这一行左移了32位。C里面位移32位都是未定义的。

收获园豆:20
嗷嗷 | 小虾三级 |园豆:757 | 2013-10-08 07:43

这个我懂了,但我是想问为什么答案用z_mask,我的不用有错吗?  Z_mask有什么好处吗?  第二章69题,抱歉题号打错了。

Terry Zhang | 园豆:179 (初学一级) | 2013-10-08 09:58

@月下客:  你真的懂了吗? z_mask就是为了处理n等于0的情况。你的答案,n等于0的时候,left的值是不确定的。书上的答案,n等于0的情况left是不确定的,但是最终答案是确定的。

嗷嗷 | 园豆:757 (小虾三级) | 2013-10-08 10:08
其他回答(1)
0

第几章的?

iEvent | 园豆:529 (小虾三级) | 2013-10-07 08:47

第二章61题

支持(0) 反对(0) Terry Zhang | 园豆:179 (初学一级) | 2013-10-07 22:27

@月下客: mask all 1's when n = 0 and all 0's otherwise

支持(0) 反对(0) iEvent | 园豆:529 (小虾三级) | 2013-10-10 08:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册