注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

[转载]计算机各种进制转换方法  

2011-12-11 21:17:13|  分类: 算法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

进制转换

  目录:

一、正数

  1. 十 -------> 二
  2. 二 -------> 十
  3. 十 -------> 八
  4. 八 -------> 十
  6. 十六------> 十
  
  1. 二 -------> 八
  2. 八 -------> 二
  3. 十六 ----> 二
  4. 二 ----> 十六
  

二、负数

  
正文:
  一、正数
  
  在高速发展的现代社会,计算机浩浩荡荡地成为了人们生活中不可缺少的一部分,帮助人们解决通信,联络,互动等各方面的问题。今天我就给大家讲讲与计算机有关的“进制转换”问题。
  我们以(25.625)(十)为例讲解一下进制之间的转化问题
  说明:小数部份的转化计算机二级是不考的,有兴趣的人可以看一看
  1. 十 -----> 二
  (25.625)(十)
  整数部分:
  25/2=12......1
  12/2=6 ......0
  6/2=3 ......0
  3/2=1 ......1
  1/2=0 ......1
  然后我们将余数按从下往上的顺序书写就是:11001,那么这个11001就是十进制25的二进制形式
  小数部分:
  0.625*2=1.25
  0.25 *2=0.5
  0.5 *2=1.0
  然后我们将整数部分按从上往下的顺序书写就是:101,那么这个101就是十进制0.625的二进制形式
  所以:(25.625)(十)=(11001.101)(二)
  十进制转成二进制是这样:
  把这个十进制数做二的整除运算,并将所得到的余数倒过来.
  例如将十进制的10转为二进制是这样:
  (1) 10/2,商5余0;
  (2) 5/2,商2余1;
  (3)2/2,商1余0;
  (4)1/2,商0余1.
  (5)将所得的余数侄倒过来,就是1010,所以十进制的10转化为二进制就是1010
  2. 二 ----> 十
  
  (11001.101)(二)
  整数部分: 下面的出现的2(x)表示的是2的x次方的意思
  1*2(4)+1*2(3)+0*2(2)+0*2(1)+1*2(0)=25
  小数部分:
  1*2(-1)+0*2(-2)+1*2(-3)=0.625
  所以:(11001.101)(二)=(25.625)(十)
  二进制转化为十进制是这样的:
  这里可以用8421码的方法.这个方法是将你所要转化的二进制从右向左数,从0开始数(这个数我们叫N),在位数是1的地方停下,并将1乘以2的N次方,最后将这些1乘以2的N次方相加,就是这个二进数的十进制了.
  还是举个例子吧:
  求110101的十进制数.从右向左开始了
  (1) 1乘以2的0次方,等于1;
  (2) 1乘以2的2次方,等于4;
  (3) 1乘以2的4次方,等于16;
  (4) 1乘以2的5次方,等于32;
  (5) 将这些结果相加:1+4+16+32=53
  3. 十 ----> 八
  (25.625)(十)
  整数部分:
  25/8=3......1
  3/8 =0......3
  然后我们将余数按从下往上的顺序书写就是:31,那么这个31就是十进制25的八进制形式
  小数部分:
  0.625*8=5
  然后我们将整数部分按从上往下的顺序书写就是:5,那么这个0.5就是十进制0.625的八进制形式
  所以:(25.625)(十)=(31.5)(八)
  4. 八 ----> 十
  (31.5)(八)
  整数部分:
  3*8(1)+1*8(0)=25
  小数部分:
  5*8(-1)=0.625
  所以(31.5)(八)=(25.625)(十)
  5. 十 ----> 十六
  (25.625)(十)
  整数部分:
  25/16=1......9
  1/16 =0......1
  然后我们将余数按从下往上的顺序书写就是:19,那么这个19就是十进制25的十六进制形式
  小数部分:
  0.625*16=10(即十六进制的A或a)
  然后我们将整数部分按从上往下的顺序书写就是:A,那么这个A就是十进制0.625的十六进制形式
  所以:(25.625)(十)=(19.A)(十六)
  6. 十六----> 十
  (19.A)(十六)
  整数部分:
  1*16(1)+9*16(0)=25
  小数部分:
  10*16(-1)=0.625
  所以(19.A)(十六)=(25.625)(十)
  如何将带小数的二进制与八进制、十六进制数之间的转化问题
  我们以(11001.101)(二)为例讲解一下进制之间的转化问题
  说明:小数部份的转化计算机二级是不考的,有兴趣的人可以看一看
  1. 二 ----> 八
  (11001.101)(二)
  整数部分: 从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化,则有:
  001=1
  011=3
  然后我们将结果按从下往上的顺序书写就是:31,那么这个31就是二进制11001的八进制形式
  小数部分: 从前往后每三位一组,缺位处用0填补,然后按十进制方法进行转化,则有:
  101=5
  然后我们将结果部分按从上往下的顺序书写就是:5,那么这个5就是二进制0.101的八进制形式
  所以:(11001.101)(二)=(31.5)(八)
  2. 八 ----> 二
  (31.5)(八)
  整数部分:从后往前每一位按十进制转化方式转化为三位二进制数,缺位处用0补充则有:
  1---->1---->001
  3---->11
  然后我们将结果按从下往上的顺序书写就是:11001,那么这个11001就是八进制31的二进制形式
  说明,关于十进制的转化方式我这里就不再说了,上一篇文章我已经讲解了!
  小数部分:从前往后每一位按十进制转化方式转化为三位二进制数,缺位处用0补充则有:
  5---->101
  然后我们将结果按从下往上的顺序书写就是:101,那么这个101就是八进制5的二进制形式
  所以:(31.5)(八)=(11001.101)(二)
  3. 十六 ----> 二
  (19.A)(十六)
  整数部分:从后往前每位按十进制转换成四位二进制数,缺位处用0补充则有:
  9---->1001
  1---->0001(相当于1)
  则结果为00011001或者11001
  小数部分:从前往后每位按十进制转换成四位二进制数,缺位处用0补充则有:
  A(即10)---->1010
  所以:(19.A)(十六)=(11001.1010)(二)=(11001.101)(二)
  4. 二 ----> 十六
  (11001.101)(二)
  整数部分:从后往前每四位按十进制转化方式转化为一位数,缺位处用0补充则有:
  1001---->9
  0001---->1
  则结果为19
  小数部分:从前往后每四位按十进制转化方式转化为一位数,缺位处用0补充则有:
  1010---->10---->A
  则结果为A
  所以:(11001.101)(二)=(19.A)(十六)

二、负数

  负数的进制转换稍微有些不同。
  先把负数写为其补码形式(在此不议),然后再根据二进制转换其它进制的方法进行。
  例:要求把-9转换为八进制形式。则有:
  -9的补码为11111001。然后三位一划
  001---->1
  111---->157
  011---->3
  然后我们将结果按从下往上的顺序书写就是:31571,那么31571就是十进制数-9的八进制形式。
  补充:
  最近有些朋友提了这样的问题“0.8的十六进制是多少?”
  我想在我的空间里已经有了详细的讲解,为什么他还要问这样的问题那
  于是我就动手算了一下,发现0.8、0.6、0.2... ...一些数字在进制之间的转化
  过程中确实存在麻烦。
  就比如“0.8的十六进制”吧!
  无论你怎么乘以16,它的余数总也乘不尽,总是余8
  这可怎么办啊,我也没辙了
  第二天,我请教了我的老师才知道,原来这么简单啊!
  具体方法如下:
  0.8*16=12.8
  0.8*16=12.8
  .
  .
  .
  .
  .
  取每一个结果的整数部分为12既十六进制的C
  如果题中要求精确到小数点后3位那结果就是0.CCC
  如果题中要求精确到小数点后4位那结果就是0.CCCC
  现在OK了,我想我的朋友再也不会因为进制的问题烦愁了!
  下面是将十进制数转换为负R进制的公式:
  N=(dmdm-1...d1d0)-R
  =dm*(-R)^m+dm-1*(-R)^m-1+...+d1*(-R)^1+d0*(-R)^0
  15=1*(-2)^4+0*(-2)^3+0*(-2)^2+1*(-2)^1+1*(-2)^0
  =10011(-2)
  其实转化成任意进制都是一样的
  C程序代码:(支持负进制)
  #include <stdio.h>
  #include <math.h>
  main()
  {
  long n,m,r;
  while( scanf( "%ld%ld",&n,&r)!=EOF){
  if (abs(r)> 1 && !(n <0 && r> 0)){
  long result[100]=;
  long *p=result;
  printf( "%ld=",n);
  if (n!=0){
  while(n!=0){
  m=n/r;*p=n-m*r;
  if (*p <0 && r <0){
  *p=*p+abs(r);m++;
  }
  p++;n=m;
  }
  for (m=p-result-1;m>=0;m--){
  if (result[m]> 9)
  printf( "%c",55+result[m]);
  else
  printf( "%d",result[m]);
  }
  }
  else printf( "0");
  printf( "(base%d)n",r);
  } }
  return;
  }
  评论这张
 
阅读(665)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017