#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 | 一个无符号整数 |
%[] | 一个字符集 |
%% | 一个精度符号 |
有一个公式:各位数字分别乖以各自的基数(进制)的(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; }