A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大家叫我小祥子 中级黑马   /  2015-4-17 22:34  /  950 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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

评分

参与人数 3黑马币 +7 收起 理由
夜空守望者 + 5 代码好神奇啊,今天也只能送这么多了.
大白菜cabbage + 1 就1分,都给你了!!
波阿波 + 1 山寨的 教会你了你来论坛装逼了 →→.

查看全部评分

3 个回复

倒序浏览
波波 你丫的,教你你还说我山寨,以后别想我教你了
回复 使用道具 举报
赞一个!
回复 使用道具 举报
以为自己写的会有点不一样,尼玛,居然和答案差不了多少,蛋疼


此贴终结
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马