将一个unsigned型数据循环右移n位

时间:2022-04-23 20:28:32

     源自《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优于自己实现的代码。