zoukankan      html  css  js  c++  java
  • 【C语言】练习2-8

    •  题目来源:《The C programming language》中的习题P38
    •  练习2-1:  编写一个函数rightrot(x,n),该函数返回将x循环右移(即从最右端移除的位将从最左端移入)n(二进制)位后所得到的值。

      第一种解法思路:每次将【x最右端右移1位】与【该位左移到最左端】  进行【或运算】 ,这样进行n次循环即可。

      实现代码如下:

    #include<stdio.h>
    
    void main(){
        unsigned rightrot(unsigned x, int n);
        unsigned a = rightrot(3,1);
        // 2^31 = 2147483648
        printf("%u
    ",a);
    }
    
      /*rightrot: rotate x to the right by n position*/
    unsigned rightrot(unsigned x, int n)
    {
     int wordlength(void);
     int rbit;              /* rightmost bit*/
     while(n-- > 0)
     {
        rbit =  x  << (wordlength() - 1);
        x = x >> 1;
        x = x | rbit; 
     }
     return x;
    }
    int wordlength(void)     
    {
     int i;
     unsigned v = (unsigned) ~0;
        
     for(i = 1; (v = v >> 1) > 0; ++i)
      ;
     return i;
    }

      第二种解法思路:判断 x 中最右端位是1还是0,是1就进行运算,若是0 ,直接右移即可。

      实现代码如下:

    #include<stdio.h>
    
    void main(){
        unsigned rightrot(unsigned x, unsigned n);
        unsigned a = rightrot(3,1);
        printf("%u
    ",a);
    }
    
    unsigned rightrot(unsigned x, unsigned n)
    {
        while (n > 0){
            if ((x & 1) == 1){  //如果最右端位为 1,进行运算
                x = (x >> 1) | ~(~0U >> 1);
            }else{              //若是0 ,直接右移即可。
                x = (x >> 1);
            }
            n--;
        }
        return x;
    }

      参考资料:http://blog.csdn.net/whdugh/article/details/8162904

  • 相关阅读:
    【Alpha】开发日志Day30714
    【Alpha】开发日志Day10712
    实验1
    实验2
    图深度优先搜索最短路径
    一切都结束了
    C#操作XML(读XML,写XML,更新,删除节点,与dataset结合等)
    字符串匹配
    纯数学规律题
    高精度
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3780786.html
Copyright © 2011-2022 走看看