您的位置:首页 > 编程语言 > C语言/C++

C 【进制查表法 求取给定十进制数的其他进制形式数值】

2016-04-12 00:11 751 查看
#include <stdio.h>

void tenToTwo(int num);
void tenToEight(int num);
void tenToSixteen(int num);
void change(int num, int base, int move);

int main()
{
change(998, 15, 4);
}

void tenToTwo(int num)
{
change(num, 1, 1);
}

void tenToEight(int num)
{
change(num, 7, 3);
}

void tenToSixteen(int num)
{
change(num, 15, 4);
}

/**
*  将十进制转化为其他进制的数值
*
*  @param num  需要转化的数值
*  @param base 每次比较位数的规定值(二进制为1位,八进制为3位,十六进制为4位)
*  @param move 所需右移位数
*/
void change(int num, int base, int move)
{
// 1.定义一个进制数组,用来保存所有的进制取值
char charValue[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

// 2.定义一个数组,用于保存转化之后的结果
char result[32] = {'0'};

// 3.pos变量是用来记下转化之后结果数组的索引的
int pos = sizeof(result) / sizeof(result[0]);

while (num != 0) { // 不管是刚传进来的num为0还是说移位之后剩下的值为0,我们都不需要再判断了,只是多加了很多0而已
// ① 取出num的第一位数值,move决定多少位数表示一位数值,base是所有位均为1时的判定值
int res = num & base;
// ② 在进制取值数组中取出对应元素(res正好对应进制数组下标)
char c = charValue[res];
// ③ 由后向前存储获得
result[--pos] = c;
// ④ 将num右移,目的为了删除我们已经截取的move位数值
num = num >> move;
}

// 4.输出计算后的结果(由于我们只是保存到pos这个索引处,所以说从pos开始遍历输出即可)
for (int i = pos; i < sizeof(result) / sizeof(result[0]); i++) {
printf("%c", result[i]);
}
printf("\n");
}

/**
程序举例分析:
(1)十进制数 998 转化为 十六进制

伪代码:
998 & base = 998 & 15 = 0011 1110 0110 & 1111 = 0110 = 6
char c = charValue[6] = '6'
998 >> 4 = 0011 1110
0011 1110 & 15 = 0011 1110 & 1111 = 1110 = 14
char c = charValue[14] = 'e'
0011 1110 >> 4 = 0011 = 3
char c = charValue[3] = '3'

pos = 32 - 1 - 1 - 1 = 29
所以只需遍历 result[29],result[30],result[31]
--->   3e6

(2)十进制数 781 转化为 八进制

伪代码:
781 & base = 781 & 7 = 001 100 001 101 & 111 = 101 = 5
char c = charValue[5] = '5'
781 >> 3 = 001 100 001
001 100 001 & 7 = 001 100 001
001 100 001 & 111 = 001 = 1
char c = charValue[1] = '1'
001 100 001 >> 3 = 001 100
001 100 & 111 = 100 = 4
char c = charValue[4] = '4'
001 100 >> 3 = 001
001 & 111 = 001 = 1
char c = charValue[1] = '1'

pos = 32 - 1 - 1 - 1 = 28
所以只需遍历 result[28],result[29],result[30],result[31]
--->   1415
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息