各种进制值间的转换,2进制,8进制,16进制互换。

请各位在代码旁边 注明 程式的执行原理 ,谢谢
我需要 程式码 加上 注解,谢谢~~~
2进制 转换为 16 进制 以及16进制 转换为 2进制,就像是 图片上的那种功能。
注意注意~~ 要能转换小数点的,还有能处理正负数的。 程式码请用 printf();这类语法,谢谢
有 程式码 并且 加上注解 的 我直接送分数。谢谢~!

不同进位计数制之间的转换原则:不同进位计数制之间的转换是根据两个有理数如相等,则两数的整数和分数部分一定分别相等的原则进行的。也就是说,若转换前两数相等,转换后仍必须相等。
有四进制
十进制:有10个基数:0 ~~ 9 ,逢十进一
二进制:有2 个基数:0 ~~ 1 ,逢二进一
八进制:有8个基数:0 ~~ 7 ,逢八进一
十六进制:有16个基数:0 ~~ 9,A,B,C,D,E,F (A=10,B=11,C=12,D=13,E=14,F=15) ,逢十六进一

1、数的进位记数法
N=a n-1*p n-1+a n-2*p n-2+…+a2*p2+a1*p1+a0*p0
2、十进制数与P进制数之间的转换
①十进制转换成二进制:十进制整数转换成二进制整数通常采用除2取余法,小数部分乘2取整法。例如,将(30)10转换成二进制数。
将(30)10转换成二进制数
2| 30 ….0 ----最右位
2 15 ….1
2 7 ….1
2 3 ….1
1 ….1 ----最左位
∴ (30)10=(11110)2
将(30)10转换成八、十六进制数
8| 30 ……6 ------最右位
3 ------最左位
∴ (30)10 =(36)8

16| 30 …14(E)----最右位
1 ----最左位
∴ (30)10 =(1E)16
3、将P进制数转换为十进制数
把一个二进制转换成十进制采用方法:把这个二进制的最后一位乘上20,倒数第二位乘上21,……,一直到最高位乘上2n,然后将各项乘积相加的结果就它的十进制表达式。
把二进制11110转换为十进制
(11110)2=1*24+1*23+1*22+1*21+0*20=
=16+8+4+2+0
=(30)10

把一个八进制转换成十进制采用方法:把这个八进制的最后一位乘上80,倒数第二位乘上81,……,一直到最高位乘上8n,然后将各项乘积相加的结果就它的十进制表达式。
把八进制36转换为十进制
(36)8=3*81+6*80=24+6=(30)10
把一个十六进制转换成十进制采用方法:把这个十六进制的最后一位乘上160,倒数第二位乘上161,……,一直到最高位乘上16n,然后将各项乘积相加的结果就它的十进制表达式。
把十六制1E转换为十进制
(1E)16=1*161+14*160=16+14=(30)10
3、二进制转换成八进制数
(1)二进制数转换成八进制数:对于整数,从低位到高位将二进制数的每三位分为一组,若不够三位时,在高位左面添0,补足三位,然后将每三位二进制数用一位八进制数替换,小数部分从小数点开始,自左向右每三位一组进行转换即可完成。例如:
将二进制数1101001转换成八进制数,则
(001 101 001)2
| | |
( 1 5 1)8
( 1101001)2=(151)8

(2)八进制数转换成二进制数:只要将每位八进制数用三位二进制数替换,即可完成转换,例如,把八进制数(643.503)8,转换成二进制数,则
(6 4 3 . 5 0 3)8
| | | | | |
(110 100 011 . 101 000 011)2
(643.503)8=(110100011.101000011)2
4、二进制与十六进制之间的转换
(1)二进制数转换成十六进制数:由于2的4次方=16,所以依照二进制与八进制的转换方法,将二进制数的每四位用一个十六进制数码来表示,整数部分以小数点为界点从右往左每四位一组转换,小数部分从小数点开始自左向右每四位一组进行转换。
(2)十六进制转换成二进制数
如将十六进制数转换成二进制数,只要将每一位十六进制数用四位相应的二进制数表示,即可完成转换。
例如:将(163.5B)16转换成二进制数,则
( 1 6 3 . 5 B )16
| | | | |
(0001 0110 0011. 0101 1011 )2
(163.5B)16=(101100011.01011011)2

参考资料:http://zhidao.baidu.com/question/21677115.html?si=2&pt=9991com%5Fik

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-13
//只处理了整数,没有错误处理
#include <iostream>
#include <string>
#include <bitset> //转换二进制串
#include <cctype> //tolower()
#include <conio.h> //getch()

using namespace std;

string to_binstring(int n){
//将整数 n 转换为每四位一组的二进制串
char bin[41] ; //存储转换结果
int count = 39 ;
bin[40] = 0 ; //设置字符串结尾
while ( n != 0 ){
for(int i = 0 ; i<4 ; ++i){
bin[count--] = (n&1) + 0x30 ; //将n的当前最低位转换为ascii码存入bin
n >>= 1 ; //下一个二进制位
}
bin[count--] = ' ' ; //每四位加一个空格
}
return string(bin+count+2) ; //将结果作为string返回
}

int main(){
int num;
char option;
string str ; //存储输入的二进制串
cout << "| 请先选择一种进制,然后输入一个数字, |\n| 我会把这个数字转换成其他数值。 |\n"
"---------------------------------------------------\n\n"
"\t\tA. 十进制\t(10)\n" "\t\tB. 十六进制\t(16)\n"
"\t\tC. 八进制\t(8)\n" "\t\tD. 二进制\t(2)\n"
"\n\t\tE. 安全出口\t(0)\n\n"
"请选择一种 进制(然后按 Enter 键):";
option = tolower(getchar()); //将输入的选项转换为小写字母以方便处理
switch(option){ //以下分别为所选择的各种情况
case 'a' :cout << "\n请输入一个 " << 10 << " 进制数:";
cin >> num ;
cout << "\n\t\t " << dec << num << " (10)"
"\n\t\t= " << hex << num << " (16)"
"\n\t\t= " << oct << num << " (8)"
"\n\t\t= " << to_binstring(num) << " (2)\n\n" ;
break ;
case 'b' :cout << "\n请输入一个 " << 16 << " 进制数:";
cin >> hex >> num ;
cout << "\n\t\t " << hex << num << " (16)"
"\n\t\t= " << dec << num << " (10)"
"\n\t\t= " << oct << num << " (8)"
"\n\t\t= " << to_binstring(num) << " (2)\n\n" ;
break ;
case 'c' :cout << "\n请输入一个 " << 8 << " 进制数:";
cin >> oct >> num ;
cout << "\n\t\t " << oct << num << " (8)"
"\n\t\t= " << dec << num << " (10)"
"\n\t\t= " << hex << num << " (16)"
"\n\t\t= " << to_binstring(num) << " (2)\n\n" ;
break ;
case 'd' :cout << "\n请输入一个 " << 2 << " 进制数:";
cin >> str ;
num = bitset<32>(str).to_ulong();
cout << "\n\t\t " << str << " (2)"
"\n\t\t= " << dec << num << " (10)"
"\n\t\t= " << hex << num << " (16)"
"\n\t\t= " << oct << num << " (8)\n\n" ;
break ;
case 'e' :return 0 ;
}
cout << "请按 Enter 键...";
while( getch() != 0xd ) ; //等待回车键
return 0;
}本回答被提问者采纳
第2个回答  2010-03-13
/*未作健壮性处理只能正确输入得正确结果*/
#include<stdio.h>

void bin(int c);
void main()
{

char a,b[100],*d;
int c,i;
printf("1. 16进制(H)\n");
printf("2. 10进制(D)\n");
printf("3. 8进制(O)\n");
printf("4. 2进制(B)\n");
printf("5. EXIT\n\n\n\n");
printf("请选择\n");
scanf("%d",&a);/*降低难度,用数字而不是字母*/
switch(a)
{
case 1:
printf("请输入一个16进制数(小写):");
scanf("%x",&c);
break;
case 2:
printf("请输入一个10进制数:");
scanf("%d",&c);
break;
case 3:
printf("请输入一个8进制数:");
scanf("%o",&c);
break;
case 4:
printf("请输入一个2进制数:");
scanf("%s",&b);
for(c=0,i=0;b[i];i++)
{
c*=2;
c+=b[i]-48;
}
break;
case 5:return;
}
printf("\n");
printf("%x H\n",c);
printf("%d D\n",c);
printf("%o O\n",c);
bin(c);
printf(" B\n");

}

void bin(int c)
{
if(c!=0)bin(c/2);
printf("%d",c%2);
}
第3个回答  2010-03-02
说实话 不知道怎么回答你的问题
8进制(8刚好是2的3次方 说以可以把2进制右边开始每3为化为一位8进制值
eg 0110 1111就是01 101 111就是157(8进制) 同理16进制是6f
想缓过来就一位换成3,4位咯^^……
想知道一个十进制数的8进制 可以用%o %x
这问题不好回答哦
相似回答