计算机中常用的数的进制主要有:二进制、八进制、十进制、十六进制。
2进制,用两个阿拉伯数字:0、1;
8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:0到9;
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。
下面用余数短除法把十进制数转化为二进制数为例进行说明
1、明确问题。举个例子,我们现在是要将一个十进制数字156转换成二进制数字。先将这个十进制数作为被除数写在一个倒着的“长除法”的符号里。把目标数系的基数(在这里二进制是“2”)作为除数写在这个除法符号的外面。用这个方法将计算过程可视化会更方便理解,因为整个计算过程只需将数字一直除以2。
2、进行除法运算。把结果的整数部分(商数)写在长除法符号的下面,然后把它的余数(0 或 1)写在被除数的右边。
我们现在是以2为除数,因此得出的商为偶数,则余数为0;如果得出商为奇数,则余数记为1。
3、一直往下继续除,直到商为0为止。把每一个新的商数除以二,然后把余数写在被除数的右边。直到商数为0为止。
4、写出新的二进制数字。从最下面的余数开始,按顺序读到最上面。本例中,你会得到10011100。这就是十进制数字156的二进制形式。或者,我们可以以脚注等式的形式表达,即:15610 = 100111002
活用这个方法可以将所有十进制数字转换成任何进制表达。除数为2是因为我们最终想得到的以2为基数的数(即二进制数值) 。如果最终想得到其他数系的数字,用目标数系的基数代替这个方法里二进制的基数2 就可以了。例如,要得到基数为9的数,就用9来代替2作为除数 。最终的结果就是目标数系的数字表达。
扩展资料:
十进制--->二进制
对于整数部分,用被除数反复除以2,除第一次外,每次除以2均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。
对于小数部分,采用连续乘以基数2,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”
十进制--->八进制
10进制数转换成8进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。
参考资料:百度百科——进制转换
十进制转化为十六进制代码:
#include "stdio.h" int main()
{
int num=0
int a[100]
int i=0
int m=0
int yushu
char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
printf("请输入一个十进制数:")
scanf("%d",&num) while(num>0) { yushu=num%16
a[i++]=yushu
num=num/16
} printf("转化为十六进制的数为:0x") for(i=i-1i>=0i--)//倒序输出 {m=a[i]
printf("%c",hex[m]) } printf("\n")
}
程序运行结果:
扩展资料:
进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。
举例:二进制数转换为十进制数
二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……
所以,设有一个二进制数:0110 0100,转换为10进制为:
下面是竖式:
0110 0100 换算成十进制
第0位 0 * 20 = 0
第1位 0 * 21 = 0
第2位 1 * 22 = 4
第3位 0 * 23 = 0
第4位 0 * 24 = 0
第5位 1 * 25 = 32
第6位 1 * 26 = 64
第7位 0 * 27 = 0
公式:第N位2(N)
---------------------------
100
用横式计算为:
0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1* 26 + 0 * 27 = 100
0乘以多少都是0,所以我们也可以直接跳过值为0的位:
1 * 22 + 1 * 25 +1*26 = 100
参考资料:
百度百科-进制转换
#include <stdio.h>#include <stdbool.h> //true, false
#include <malloc.h>
#include <stdlib.h> //atoi() 字符串转整数
#include <ctype.h> //isalpha(), isdigit()
#include <string.h>
#include <math.h>
/// 输入字符串数字,字符串长度,该数字是几进制数
/// 返回一个十进制数
int StrToInt(char* str, size_t len, size_t base)
{
bool isnegtive = false //该数是否表示负数
int i = 0
if (str[0] == '-')
{
i++
isnegtive = true
}
int num = 0 // 最后计算出的10进制数
for ( i < len ++i)
{
char tem = toupper(str[i]) //若为字母,转换成大写字母,其余不变
int index = 0
if (isalpha(tem)) // 若是字母,转化成对应的10进制数
index = tem - 'A' + 10
else if(isdigit(tem))
index = tem - '0'
else { /* do nothing*/ }
num += index * (int)pow(base, len - 1 - i)
}
return isnegtive ? -num : num
}
/// 把10进制数转换成 指定进制的数
void ToBaseNumber(int orig, size_t base)
{
if (orig == 0)
{
printf("%d\n", 0)
return
}
if (orig < 0)
{
putchar('-')
orig = -orig // 变成正数
}
int* arr = (int* )malloc(sizeof(int) * 16), len = 0, i
while (orig > 0)
{
arr[len++] = orig % base
orig /= base
}
for (i = len - 1 i >= 0 --i)
{
printf("%d", arr[i])
}
putchar('\n')
return
}
int main(int argc, char const *argv[])
{
int T
scanf("%d", &T)
while (T--)
{
char* chs = (char* )malloc(sizeof(char) * 16)
int n, m
scanf("%s %d %d", chs, &n, &m)
int orig = StrToInt(chs, strnlen(chs, 11), n)
ToBaseNumber(orig, m)
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)