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

  • 相关阅读:
    贝塞尔曲线
    View Transform(视图变换)详解
    list::splice()函数详解
    c语言宏定义
    Shadow mapping
    spring管理事务
    sql标准支持了事务隔离级别
    java cocurrent并发包
    spring事务详细理解
    spring aop提供了两种实现方式jdk和cglib
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3780786.html
Copyright © 2011-2022 走看看