找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1695|回复: 6

[求助]十六进制到十进制的转换算法

[复制链接]
发表于 2009-11-6 01:18:05 | 显示全部楼层 |阅读模式 IP:江苏扬州
如0xFFFF,为 -1;(呵呵,不知道正不正确)
总之,就是当最高位为 1 时,要转换成负数


如:
在最高位的符号位为正数(0)时好求,如下:
0x1111;转换如下:sum = 1*pow(16,0)+1*pow(16,1)+1*pow(16,2)+1*pow(16,3);
但当最高位的符号位为负数(1)时,例如:
0xFFFF;在二进制的转换如下,
转换成二进制:1111 1111 1111 1111,取反:0000 0000 0000 0000 再加1,成为0000 0000 0000 0001;
故sum = -1*pow(2,0);
发表于 2009-11-6 01:18:08 | 显示全部楼层 IP:江苏扬州
代码如下:(不能判断输入的有效性)
即不能判断若输入"0xsss"这类的非法数字

#include<iostream>
#include<math.h>
using namespace std;
void main()
{
char a[100];
int sum=0;
int num=0;
int k=0;
cout<<"请输入16进制的一个数!"<<endl;
cin>>a;
for(int i=2;a[i]!='\0';)
{
i++;
}
i=i-1;
for(int j=i;a[j]!='x';j--)
{
switch(a[j])
{
case'0':num=0;break;
case'1':num=1;break;
case'2':num=2;break;
case'3':num=3;break;
case'4':num=4;break;
case'5':num=5;break;
case'6':num=6;break;
case'7':num=7;break;
case'8':num=8;break;
case'9':num=9;break;
case'a':num=10;break;
case'b':num=11;break;
case'c':num=12;break;
case'd':num=13;break;
case'e':num=14;break;
case'f':num=15;break;
}
sum=sum+num*pow(16,k);
k++;
}
i=0;
if(a[i]=='1') sum=-sum;
cout<<"转化为10进制为:\t";
cout<<sum<<endl;
}
回复

使用道具 举报

发表于 2009-11-6 01:18:09 | 显示全部楼层 IP:江苏扬州
for(int j=i;a[j]!='x';j--)
{
switch(a[j])
{
case'0':num=0;break;
case'1':num=1;break;
case'2':num=2;break;
case'3':num=3;break;
case'4':num=4;break;
case'5':num=5;break;
case'6':num=6;break;
case'7':num=7;break;
case'8':num=8;break;
case'9':num=9;break;
case'a':num=10;break;
case'b':num=11;break;
case'c':num=12;break;
case'd':num=13;break;
case'e':num=14;break;
case'f':num=15;break;
}
sum=sum+num*pow(16,k);
k++;
}
麻烦.
if(str[i]>='a'&&str[i]<='f')t=str[i]-'a'+10;
else t=str[i]-'0';
回复

使用道具 举报

发表于 2009-11-6 01:18:11 | 显示全部楼层 IP:江苏扬州
谢谢楼上的赐教~~~

不胜感激
回复

使用道具 举报

发表于 2009-11-6 01:18:12 | 显示全部楼层 IP:江苏扬州
我明白了楼主的意思了~~
但是当我对一个数取反的时候并不能实现啊~~

16进制:0xffff=65535

int sum=65535
sum=~sum //对该位数取反
cout<<sum;

应该出来结果为0;

但是出来的结果是-65536,而不是楼主所说的0,

请问各位高手这是怎么回事
回复

使用道具 举报

发表于 2009-11-6 01:18:13 | 显示全部楼层 IP:江苏扬州
程序代码:

#include <stdio.h>
int main()
{
int n;
while(scanf("%x",&n)!=EOF){
printf("%d\n",n);
}
}
回复

使用道具 举报

发表于 2009-11-6 01:18:15 | 显示全部楼层 IP:江苏扬州
原来iomanip.h中有这个函数的~~~


#include<iostream.h>
#include<iomanip.h>
int main()
{
int n;
cout<<"请输入一个16进制的数!"<<endl;
cin>>hex>>n;
cout<<"转化为10进制为:"<<endl;
cout<<dec<<n<<endl;
return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 17:39 , Processed in 0.198992 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表