免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 8558 | 回复: 33
打印 上一主题 下一主题

[C] 【原创】任意正整数转换为四进制或八进制数  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-07 01:37 |只看该作者 |倒序浏览
本帖最后由 sohu2000000 于 2010-09-07 01:40 编辑

将任意正整数转换为四进制或八进制数。

刘峰六:  
(1)  请小心一个问题,对于8禁止,相当于3位一段,32位是不能被三整除的,也就会导致结果不正确
(2)  对于1111111000011这样的数字,如果数字式正数,如果前面补足N个0,那么其实数字的大小是不变的,所以这里我传入了sizeof(int)+1,也就是33
      但是如果是负数,那么只有2,4进制是正确的,因为它们不需要补位,但是对于8进制的话,如果开始是1,表示的是负数,那么就会涉及符号位的问题
      是补零还是补充一是不一定的,不同的编译器有着不同的处理,有的补1,有的补0(见《C语言教程》-- 谭浩强,昨儿刚查滴… … )(因为int是32位,所以
      永远是2和1滴倍数)
(3) 本体米有涉及16进制,涉及了也很简单,只要多个大于10就用 ‘A’ + ((unsigned )(x&(1<<(n-1))) >>(n-1))); 就OK了,因为32也是4的倍数,所以
      还是八进制最复杂~~~~~~~
  1. #include <stdio.h>

  2. void printbin(int, int);
  3. void printQuater(int,int);
  4. void printOtc(int,int);

  5. int main(void)
  6. {
  7.         int x;
  8.         printf("Input Number: ");
  9.         scanf("%d", &x);

  10.     //Binary
  11.         printf("it's binary form: ");
  12.         printbin(x, sizeof(int)*8);
  13.         putchar('\n');

  14.     //Quaternary
  15.     printf("it's Quaternary form: ");
  16.     printQuater(x, (sizeof(int)*8));
  17.     putchar('\n');

  18.     //OTC
  19.     printf("it's Otc form: ");
  20.     printOtc(x, (sizeof(int)*8+1));
  21.     putchar('\n');

  22.     return 0;
  23. }

  24. //Binary
  25. void printbin(int x, int n)
  26. {
  27.         if(n>0)
  28.         {
  29.                 putchar('0'+((unsigned) ( x & (1 << (n-1)))  >> (n-1)));
  30.                 printbin(x,n-1);
  31.         }
  32. }


  33. // Quaternary
  34. void printQuater(int x,int n)
  35. {
  36.     if(n>0)
  37.     {
  38.         putchar('0'+ ((unsigned)( x & ( 3 << (n-2))) >> (n-2) ) );
  39.         printQuater(x,n-2);
  40.     }
  41. }

  42. //Octal
  43. void printOtc(int x, int n)
  44. {
  45.     if(n>0)
  46.     {
  47.         putchar('0'+ ((unsigned)( x & ( 7 << (n-3))) >> (n-3) ) );
  48.         printOtc(x,n-3);
  49.     }

  50. }
复制代码
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/09/07/5867499.aspx

论坛徽章:
0
2 [报告]
发表于 2010-09-07 08:54 |只看该作者
又见作业帖…………

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
3 [报告]
发表于 2010-09-07 08:56 |只看该作者
8进制输出,只要printf("%o", n);

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
4 [报告]
发表于 2010-09-07 08:57 |只看该作者
另外,4进制数有什么用?

论坛徽章:
0
5 [报告]
发表于 2010-09-07 14:26 |只看该作者
回复 2# daybreakcx


   
又见作业帖…………
daybreakcx 发表于 2010-09-07 08:54



    同学,又是你... ...
    我想说几点我的个人看法:
   1. 这不是作业贴,已经N久没有人给我留作业可以做了
   2. 即使这个题目给了一个工作了的人,他没准也只是按照数据结构里面的堆栈做,这样的小巧漂亮的代码不好么?我觉得很多工作后的人是否可以做出来呢?即使有些学生级别的代码题目
      一样可以展示出不同的层次,比如说通讯录,我上学的时候写数组,写链表,工作一年写成hash表,在往后写成binary树,之后是AVL树,后来是红黑树,都是这个题目,有什么可以
      非议的么?
   3. 这里所有的code都是我自己想的,没有一个是照着抄的,而且我的代码都是可以编译的,不像是默写CSDN上的代码下来,不是少个关键句子,就是少个头文件什么的。我希望自己的这些
      行为让某些人摒去一些藏着掖着的不好的习惯,也想给正在上学的或者自学,初学的朋友们一点点帮助,必经我是从那时候过来的,多不容易我心里明白,我希望他们可以过的平稳些...
        当然,也许根本没有那么大作用,但至少没有害处  (^o^)

论坛徽章:
0
6 [报告]
发表于 2010-09-07 14:29 |只看该作者
回复 3# noword2k


   
8进制输出,只要printf("%o", n);
noword2k 发表于 2010-09-07 08:56

     那如果让你做的是2进制或者32进制的呢?  如果是内核开发,不容许使用printf这种危险函数的呢?  如果是基于某个平台开发,而该平台没有实现%o这样的呢?

   (^0^)

论坛徽章:
0
7 [报告]
发表于 2010-09-07 14:48 |只看该作者
回复 4# noword2k


   
另外,4进制数有什么用?
noword2k 发表于 2010-09-07 08:57


    物理学应用  http://en.wikipedia.org/wiki/Quaternary

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
8 [报告]
发表于 2010-09-07 15:01 |只看该作者
回复  noword2k


   
     那如果让你做的是2进制或者32进制的呢?  如果是内核开发,不容许使用pri ...
sohu2000000 发表于 2010-09-07 14:29



    有现成的ltoa,从2进制到36进制都可以转,虽然不是ANSI C的函数,但是好歹有搜索引擎不是:
http://www.google.com/codesearch ... cense=&as_case=

程序员的三大美德之首就是“懒惰”,重复造轮子是愚蠢的行为。

printf怎么就危险了?你能让printf溢出内存?
www.kernel.org,下载个最新的内核包,解开后“grep printf * -r|less”看看,有多少printf甚至sprintf。

论坛徽章:
0
9 [报告]
发表于 2010-09-07 15:06 |只看该作者
递归的效率差点,改成循环吧!

论坛徽章:
0
10 [报告]
发表于 2010-10-06 16:46 |只看该作者
回复 9# zhangsuozhu


    这个还真是要请教一句: 循环比递归要快,效率高么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP