二 八 十 十六进制之间数据转换

#include <iostream>
#include <bitset>
#include <stdlib.h>
using namespace std;
int main()
{
  int a = 100;
  cout<<"十进制 "<<a<<endl;
  cout<<"十六进制 "<<hex<<a<<endl;
  cout<<"八进制 "<<oct<<a<<endl;
  cout<<"二进制 "<<bitset<8>(a)<<" "<<bitset<32>(a)<<endl; // 这里使用了bitset类来输出2进制数据
  cout<<"--------------------------------"<<endl;

  printf("十进制 %d\n", a);
  printf("十六进制 %x\n", a);
  printf("八进制 %o\n", a);
  char binary_text[100];
  itoa(a, binary_text, 2);
  printf("二进制 %s\n", binary_text);
  return 0;

int scanf( const char *format, ... );
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。     其调用格式为: scanf("<格式化字符串>",<地址表>)。
scanf("%d,%d", &a, &b);                如果a和b都被成功读入,那么scanf的返回值就是2                    如果只有a被成功读入,返回值为1                    如果a和b都未被成功读入,返回值为0         如果遇到错误或遇到end of file,返回值为EOF 。 
  

//打印消息的二进制值
      char result[8];
      char* echobin = new char[(size-pos)*10];
      memset(echobin,0,(size-pos)*10);
      int echolen = 0;
      for(int i=0; i<(size-pos); i++)
      {
       for(int j=0; j<8; j++)
       {
        sprintf(result+j,"%d",*(pbuf+pos+i)<<j & 128); //从高位到低位的二进制位
        memmove(echobin+echolen,result+j,sizeof(char));
        echolen++;
       }
       memmove(echobin+echolen,"&",sizeof("&"));
       echolen++;
      }
      LOG(1)("echobin=%s\n",echobin);
      LOG(1)("bin end!echolen=%d\n",echolen);
      delete echobin;
      echobin = NULL;

控制字符 说明
%c 一个单一的字符
%d 一个十进制整数
%i 一个整数
%e, %f, %g 一个浮点数
%o 一个八进制数
%s 一个字符串
%x 一个十六进制数
%p 一个指针
%n 一个等于读取字符数量的整数
%u 一个无符号整数
%[] 一个字符集
%% 一个精度符号


1、二进制数、八进制数、十六进制数转十进制数
有一个公式:各位数字分别乖以各自的基数(进制)的(N-1)次方,其和相加之和便是相应的十进制数。个位,举例:
二进制:    110=1*2的2次方+1*2的1次方+0*2的0次方=0+4+2+0=6
八进制:    110=1*8的2次方+1*8的1次方+0*8的0次方=64+8+0=72
十六进制: 110=1*16的2次方+1*16的1次方+0*16的0次方=256+16+0=272

2.十进制转其它进制(两种方法)
第一种方式:除以进制位
    一、 十进制转二进制 
如:55转为二进制 
2|55 
27――1 个位 
13――1 第二位 
6――1 第三位 
3――0 第四位 
1――1 第五位 
最后 被除数 1为第六位,即得110111 
二、十进制转八进制 
如:5621转为八进制 
8|5621 
702 ―― 5 第一位(个位) 
87 ―― 6  第二位 
10 ―― 7  第三位 
1 ―― 2   第四位 
最后得八进制数:12765
三、十进制数十六进制 
如:76521转为十六进制 
16|76521 
4782 ――9 第一位(个位) 
298 ――E 第二位 
18 ――A 第三位 
1 ―― 2 第四位 
最后得12AE9 
第二种方式:
先把十进制转换为二进制,然后取二进制每4位为16进制的一位(共8位),每3位为8进制的一位(共11位)
可以与1111和111相与来得出它们的每一位
其实这两种方法是一样的,一种是十进制的除法,一种是二进制的除法(16进制为例:位移4位是求除的结果,与1111相与是求余)


2.二进制数转换成其它进制
二进制转八进制:从小数点位置开始,整数部分向左,小数部分向右,每三位为一组用八进制的数字来表示
010110.001100B=26.14

八进制转二进制反之则可。
二进制转十六进制:从小数点位置开始,整数部分向左,小数部分向右,每四位为一组用十六进制的数字来表示,
00100110.00010100B=26.14
十进制转其他进制代码
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#define MAP_LEN 16
//各进制的最大长度
#define HEX_SHIFT 4
#define HEX_LEN ( (int)(32/HEX_SHIFT) + 1 )     9

#define OCT_SHIFT 3
#define OCT_LEN ( (int)(32/OCT_SHIFT) + 1 )      11

#define BIN_SHIFT 1
#define BIN_LEN ( (int)(32/BIN_SHIFT) + 1 )      33

static char mapTable[MAP_LEN] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };

void int2other( int number, int size, int mask, int shift )//size为字符位数(保存转换后的字符),mask 为1111  111  1,shift为4 3 1
{//mask根据进制取1111  111  1(十六  八  二)
        char* result = new char[size];
	memset(result,0,size);
        int i = 0,idx;
        while ( number )//传进来的十进制数
        {
		idx = number & mask; // 相当于除法的求余(或二进制的&)
		result[ i ] = mapTable[ idx ];//十六进制数保存在全局变量maptable中
		number = number >> shift; // 右移进行下一组计算
		++i;
        }
	//输出值
	//printf( "%s\n", result );//这个是正序的  应该逆序输出
		
        for ( --i; i >= 0; i-- ) 
        {
	printf( "%c", result[i] );//i从大到小逆序输出字符
        }
	delete[] result;		
}

void int2hex( int number )
{
	printf("number=%d HEX_LEN=%d HEX_SHIFT=%d\n",number,HEX_LEN,HEX_SHIFT);
	int2other( number, HEX_LEN, 0xF, HEX_SHIFT );//9    1111    4
}

void int2oct( int number)
{
	printf("number=%d OCT_LEN=%d OCT_SHIFT=%d\n",number,OCT_LEN,OCT_SHIFT);
	int2other( number, OCT_LEN, 0x7, OCT_SHIFT );//11   111      3
}

void int2bin( int number)
{
	printf("number=%d BIN_LEN=%d BIN_SHIFT=%d\n",number,BIN_LEN,BIN_SHIFT);
	int2other( number, BIN_LEN, 0x1, BIN_SHIFT );//33    1       1
}

int main()
{
	int num = 76521;
	printf( "%d's hex is: ", num );
	int2hex(num);

	printf( "%d's oct is: ", num );
	int2oct(num);

	printf( "%d's bin is: ", num );
	int2bin(num);
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值