写一个循环右移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));
}
谁能告诉我这个答案有什么好处吗? 或者我的有什么缺陷吗? 我自己感觉我写的足够了啊。 求高人指教。
n等于0时,left这一行左移了32位。C里面位移32位都是未定义的。
这个我懂了,但我是想问为什么答案用z_mask,我的不用有错吗? Z_mask有什么好处吗? 第二章69题,抱歉题号打错了。
@月下客: 你真的懂了吗? z_mask就是为了处理n等于0的情况。你的答案,n等于0的时候,left的值是不确定的。书上的答案,n等于0的情况left是不确定的,但是最终答案是确定的。
第几章的?
第二章61题
@月下客: mask all 1's when n = 0 and all 0's otherwise