黑马程序员技术交流社区

标题: 左移与右移问题 [打印本页]

作者: 大家叫我小祥子    时间: 2015-4-17 22:34
标题: 左移与右移问题
  1. /*

  2. 编写一个移位函数,使移位函数既能循环左移又能循环右移。参数n大于0时便是左移,参数n小于0时便是右移

  3. 解释:循环右移:把右边移出的位放到左边移入的位
  4. 如: 1101 0101 1100 循环左移四位  0101 1100 1101

  5. 循环左移:把左边移出的位放到右边移入的位


  6. */

  7. #include <stdio.h>


  8. /**
  9. *  打印出二进制
  10. *
  11. *  @param num 要打印的数字
  12. */

  13. void printBianry(int num)
  14. {
  15.     int length = sizeof(num)*8; //这句话是废话,反正我也照这个写了
  16.    
  17.     for (int i=0; i<length; i++)
  18.     {
  19.         printf("%d",(num>>(31-i)) & 1);
  20.     }
  21.     printf("\n");
  22. }


  23. /**
  24. *  循环移动,考虑正数和负数
  25. *
  26. *  @param num 要传入的数值,该值为无符号整形
  27. *  @param n   负数表示右移,移动的长度是-n,正数表示左移,移动的长度为n
  28. */
  29. int BianryCircleMoving(unsigned num,int n)
  30. {
  31.     if (n<0)
  32.     {// 表示右移 长度为-n
  33.         num = (num >> (-n)) | (num << (32+n));
  34.     }
  35.     else
  36.     {// 表示左移,长度为n
  37.         num = (num << n) | (num >> (32-n));
  38.     }
  39.    
  40.     return num;
  41. }



  42. int main(int argc, const char * argv[])
  43. {
  44.     int num = 0;
  45.     printf("请输入你要移动的数据:\n");
  46.     scanf("%d",&num);
  47.    
  48.     int length = 0;
  49.     printf("请输入你要移动的方向以及位数(-1表示向右移动一位,1表示左移一位):\n");
  50.     scanf("%d",&length);
  51.    
  52.     printBianry(num);
  53.    
  54.     int result = BianryCircleMoving(num, length);
  55.    
  56.     printBianry(result);
  57.    
  58.     return 0;
  59. }
复制代码
请输入你要移动的数据:
-2
请输入你要移动的方向以及位数(-1表示向右移动一位,1表示左移一位):
4
11111111111111111111111111111110
11111111111111111111111111101111
-17Program ended with exit code: 0


作者: 大家叫我小祥子    时间: 2015-4-17 22:38
波波 你丫的,教你你还说我山寨,以后别想我教你了
作者: wws    时间: 2015-4-17 23:24
赞一个!
作者: 大家叫我小祥子    时间: 2015-4-17 23:38
以为自己写的会有点不一样,尼玛,居然和答案差不了多少,蛋疼


此贴终结




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2