源自《The C Programming Language》P40 pr2-8:
编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位从最左端移入)n(二进制)位后所得的值。
代码:
分析:
1, 自己实现的rightrot有两个问题:
a:代码不够简洁,有冗余代码和数据。
b:默认机器字长为32位,在一些机器上(字长不是32位的),这样可能行不通。
2, 参考代码1中的优点:
定义了函数wordlength,求取机器的字长,这样就可避免1中b问题,
无论字长是32位,16位,或是64位,都能正确的进行移位。
3, 参考代码2:
a:这个方案不需要使用循环,执行速度快
b:当if语句中的n = wordlength()时,表示进行循环右移的总位数n与一个无符号整数的二进制位数(这台机器的字长)
相等, 完成这些次循环右移后的结果将与x完全一样,因此,对这类情况,可以不移x,直接返回x值。
当n < wordlength()时,这时将x循环右移n位。
当n > wordlength()时,求出n为这台机器字长的余数(n % wordlength()),
再把x循环右移这个余数所代表的次数。
综上,代码2优于代码1,代码1优于自己实现的代码。