进制转换

//将16进制的一个字符转换为十进制的数
unsigned char CConvNumsDlg::BtoH(char ch)
{
 //0-9
 if (ch >= '0' && ch <= '9')
  return (ch - '0');        

 //9-15
 if (ch >= 'A' && ch <= 'F')
  return (ch - 'A' + 0xA);  

 //9-15
 if (ch >= 'a' && ch <= 'f')
  return (ch - 'a' + 0xA); 
 return(255);
}

//转换十进制数
void CConvNumsDlg::OnDecimalConv()
{
 UpdateData(TRUE);
 //先转换为二进制
 m_strBinary = DecimalToBinary(m_strDecimal);

 //再转换为十六进制
 m_strHex = BinaryToHex(m_strBinary);
 UpdateData(FALSE);
}

//转换二进制数
void CConvNumsDlg::OnBinaryConv()
{
 UpdateData(TRUE);
 //转换为十进制
 m_strDecimal = BinaryToDecimal(m_strBinary);

 //转换为十六进制
 m_strHex = BinaryToHex(m_strBinary);
 UpdateData(FALSE);
}

//转换十六进制数
void CConvNumsDlg::OnHexConv()
{
 UpdateData(TRUE);
 //先转换为二进制
 m_strBinary = HexToBinary(m_strHex);

 //再转换为十进制
 m_strDecimal = BinaryToDecimal(m_strBinary);
 UpdateData(FALSE);
}

//转换十六进制为二进制
CString CConvNumsDlg::HexToBinary(CString strHex)
{
 int nLenth = strHex.GetLength();
 char* Hex = new char[nLenth];
 Hex = strHex.GetBuffer(0);
 CString strBinary = "";
 for(int i=0;i<nLenth;i++)
 {
  //转换一位十六进制数为十进制
  char h = Hex[nLenth-1-i];
  int j = BtoH(h);
  CString str;
  str.Format("%d",j);

  //转换十进制为4为二进制
  str = DecimalToBinary(str);
  strBinary += str;
 }
 return strBinary;
}

//转换二进制为十六进制
CString CConvNumsDlg::BinaryToHex(CString strBinary)
{
 int nLength = strBinary.GetLength();
 CString str = strBinary;
 //位数不是四的倍数时补齐
 switch(nLength%4)
 {
 case 0:
  break;
 case 1:
  strBinary.Format("%d%d%d%s",0,0,0,str);
  break;
 case 2:
  strBinary.Format("%d%d%s",0,0,str);
  break;
 case 3:
  strBinary.Format("%d%s",0,str);
  break;
 default:
  return "";
  break;
 }

 CString strHex,str1;
 str1 = "";
 nLength = strBinary.GetLength();
 for(int i=1;i<=(nLength/4);i++)
 {
  //每四位二进制数转换为一十六进制数
  str = strBinary.Left(4);
  CString strDecimal = BinaryToDecimal(str);
  int nDecimal = atoi(strDecimal.GetBuffer(0));
  if(nDecimal<10)
   str1.Format("%d",nDecimal);
  else
  {
   char c = 'A' + (nDecimal-10);
   str1.Format("%c",c);
  }
  strHex += str1;
  strBinary = strBinary.Right(strBinary.GetLength()-str.GetLength());
 }
 return strHex;
}

//转换十进制为二进制
CString CConvNumsDlg::DecimalToBinary(CString strDecimal)
{
 int nDecimal = atoi(strDecimal.GetBuffer(0));

 int nYushu; //余数
 int nShang; //商
 CString strBinary = "";
 char buff[2];
 CString str = "";
 BOOL bContinue = TRUE;
 while(bContinue)
 {
  nYushu = nDecimal%2;
  nShang = nDecimal/2;
  sprintf(buff,"%d",nYushu);
  str = strBinary;
  strBinary.Format("%s%s",buff,str);
  nDecimal = nShang;
  if(nShang==0)
   bContinue = FALSE;
 }
 return strBinary;
}

//转换二进制为十进制
CString CConvNumsDlg::BinaryToDecimal(CString strBinary)
{
 int nLenth = strBinary.GetLength();
 char* Binary = new char[nLenth];
 Binary = strBinary.GetBuffer(0);
 int nDecimal = 0;
 for(int i=0;i<nLenth;i++)
 {
  char h = Binary[nLenth-1-i];
  char str[1];
  str[0] = h;
  int j = atoi(str);
  for(int k=0;k<i;k++)
  {
   j=j*2;
  }
  nDecimal += j;
 }
 CString strDecimal;

 strDecimal.Format("%d",nDecimal);
 return strDecimal;
}

//提取指定位,默认为第一位
int CConvNumsDlg::Extraction (int number,int idx)
{
 int i, ret;
    ret=number;
 for(i=1;i<idx;i++)
 {
  ret=ret/10;
 }
 return ret%10;

}

//提取指定几位
int  CConvNumsDlg::Extraction1 (int number,int nlow,int nhigh)
{
  int i,j, ret,ret1,ret2;
  int k0,k1,k2;
  ret=number;
  int str[2]={0};
  if (ret/(10^nhigh)<=0)
  {
   AfxMessageBox("输入数字不符合要求!");
  }
  if (nlow>nhigh)
  {
   AfxMessageBox("调用函数错误!");
  }
  else
  {
   for(i=0;i<nlow;i++)
   {
    ret1=ret/10;
   }
   k1=ret1%10;
   /*str1.Format("%d",low);*/
   for( j=nlow;j<=nhigh;j++)
   {
    ret2=ret1/10;
    k2=ret2%10;
   }
 
   k0=k1+k2*10;
   return k0;
 
  }

}

CString CConvNumsDlg::Extraction2 (CString number,int nlow,int nhigh)
{
 int n=nhigh-nlow+1;
 int k0[10],k1[10],k2[10],k;
 CString str;
 int ret=atoi(number);
 int p=pow((double)10,nlow-1);
 k=ret/p;
 int ncount=1;
 int i;
 for(i=1;i<n;i++)
 {
  k0[i]=k;
  int p1=pow((double)10,i);
  k0[i]=k0[i]/p1;
  k2[i]=k0[i]%10;
  ncount++;
  k1[i]+=k2[i]*p1;
 }
 str.Format("%d",k1);
 return str;
}

unsigned int CConvNumsDlg::GetBits(char *p,int pos,int len)
{
 int len1=strlen(p);
 char *f=new char[len1];
 int n=len/4;
 int k=pos/4;
 int i;
 for( i=0;i<n;i++)
 {
  f[i]=p[k+i];
 }
 f[i]='\0';
 int num=atoi(f);
 delete [] f;
 return num;
}

 

//左移几位
CString  CConvNumsDlg::Moveleft(CString number,CString ncount)
{
 int i,j,ret;
 ret=atoi(number);
    j=atoi(ncount);
 i=ret<<j;
 CString str;
 str.Format("%d",i);
 return str;

}

//右移几位
CString  CConvNumsDlg::Moveright(CString number,CString ncount)
{
 int i,j,ret;
 ret=atoi(number);
 j=atoi(ncount);
 i=ret>>j;
 CString str;
 str.Format("%d",i);
 return str;

}

//获取奇数位
unsigned int CConvNumsDlg::getOddBits(unsigned int value)
{  
 unsigned int temp,result;  
 int i,j;  
 //八进制数52525为16位二进制数0101010101010101
 value=value & 052525;  
 result=0;
 j=7;  
 for(i=14;i>=0;i-=2)
 {  
  temp=value >> i; // 将从左边起的1、3、5……位依次移到最右边 
  temp=temp & 01;  //屏蔽掉除最右边的其余位  
  temp=temp << j;  // 将取出的第1位移到8位数的最高位,第2位移到8位数从左边起的第2位,
  result=result|temp; // 取出的结果 
  j--;  
 }  
 return(result);  
}  


//获取指定3-6位
unsigned int CConvNumsDlg::getBits(unsigned int value)
{  
 unsigned int temp,result;  
 int i,j;  
 //八进制数00074为16位二进制数0000000000111100
 value=value & 000074;  
 result=0;
 j=7;  
 for(i=6;i>=3;i--)
 {  
  temp=value >> i; // 将左边起的3-6位依次移到最右边 
  temp=temp & 01;  //屏蔽掉除最右边的其余位  
  temp=temp << j;  // 将取出的第1位移到8位数的最高位,第2位移到8位数从左边起的第2位,
  result=result|temp; // 取出的结果 
  j--;  
 }  
 return(result);  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值